r - 将 nberDates() 更改为 R 中的时间序列以进行子集化

标签 r time-series indexing xts

tis 包中的

nberDates() 给出了经济衰退开始和结束日期的列表。

将其转换为一组用于对现有时间序列进行子集化的虚拟对象的最巧妙、最短的方法是什么?

所以,nberDates 本身产生......

> nberDates()
         Start      End
 [1,] 18570701 18581231
 [2,] 18601101 18610630
 [3,] 18650501 18671231
 [4,] 18690701 18701231
 [5,] 18731101 18790331
 [6,] 18820401 18850531

str(nberDates())表示类型是“Named num”。

我在 xts 中有另一个时间序列对象,目前看起来像这样......

> head(mydata)
                value
1966-01-01         15
1967-01-01         16
1968-01-01         20
1969-01-01         21
1970-01-01         18
1971-01-01         12

我想要第二个变量,即“休息”,在经济衰退期间为 1:

> head(mydata)
                value recess
1966-01-01         15      0
1967-01-01         16      0
1968-01-01         20      0
1969-01-01         21      0
1970-01-01         18      1
1971-01-01         12      0

(我的目标是能够将经济衰退中的值(value)与经济衰退后的值(value)进行比较。)

我正在尝试但不起作用的笨重的事情是......

((index(mydata) > as.Date(as.character(nberDates()[,1]),format="%Y%m%d")) & (index(mydata) < as.Date(as.character(nberDates()[,2]),format="%Y%m%d")))

但这会产生......

 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
Warning messages:
1: In `>.default`(index(mydata), as.Date(as.character(nberDates()[,  :
  longer object length is not a multiple of shorter object length
2: In `<.default`(index(mydata), as.Date(as.character(nberDates()[,  :
  longer object length is not a multiple of shorter object length

我知道我可以用一个笨重的 for 循环来解决这个问题,但这总是表明我在 R 上做错了。

有什么建议吗?

最佳答案

应该执行以下操作:

sapply(index(mydata), function(x) any(((x >= as.Date(as.character(nberDates()[,1]),format="%Y%m%d") & (x <= as.Date(as.character(nberDates()[,2]),format="%Y%m%d"))))))

sapply 基本上会遍历向量并检查每个元素是否落入 NBER 区间之一。

但请注意,当前的编写方式意味着它将为 mydata 中的每个元素将原始 NBER 数据转换为日期 (as.Date),因此您可能需要要进行一次转换,请将其保存到某个临时数据帧,然后在其上运行上面的代码。

关于r - 将 nberDates() 更改为 R 中的时间序列以进行子集化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10804376/

相关文章:

r - 使用 source 与 parse 和 eval 相比有哪些注意事项?

r - 根据 R 中的子集获取特定行

python - Python 中 R 的 seq_len 等价物

python-2.7 - 用于实时分析的正确 Python 数据结构?

向量/一维数组的 MATLAB 索引约定

r - 在 R 的 read.table() 中指定多字符注释标记

sql - 检索连续行之间具有最小时间间隔的 ID

R - 过滤时间序列

sql - Postgres - 理解索引

swift - 无法使用类型为 '[xxx]' 的索引下标类型为 '(Int, () -> ())' 的值