基于变量名称向量创建一个新的动物园对象

Create a new zoo object based on a vector of variable names

设置种子和变量。请假设一切都是这样 部分是给定的且不可更改。

library(zoo)
set.seed(123)
a <- zoo(rnorm(10), order.by = as.Date(50:60))
b <- zoo(rnorm(10), order.by = as.Date(50:60))
c <- zoo(rnorm(10), order.by = as.Date(50:60))
lags <- c(1,3,1)
variables <- c("a","c","b")

我想创建一个足够的动物园对象,它按顺序从列表 "variables" 中选择变量并应用 "lags" 中的滞后。这是我想要的输出(包括列名):

                   a.l1       c.l3        b.l1
20/02/1970           NA         NA          NA
21/02/1970  -0.56047565         NA   1.2240818
22/02/1970  -0.23017749         NA   0.3598138
23/02/1970   1.55870831 -1.0678237   0.4007715
24/02/1970   0.07050839 -0.2179749   0.1106827
25/02/1970   0.12928774 -1.0260044  -0.5558411
26/02/1970   1.71506499 -0.7288912   1.7869131
27/02/1970   0.46091621 -0.6250393   0.4978505
28/02/1970  -1.26506123 -1.6866933  -1.9666172
01/03/1970  -0.68685285   0.837787   0.7013559
02/03/1970  -0.44566197  0.1533731  -0.4727914

这是我能达到的最接近的一个,但它不起作用。我认为问题出在 "get" 函数中。

lag(as.zoo(mget(variables)),lags-1)

非常感谢

mget(variables) 实际上返回一个列表,其中每个变量在 variables 中包含一个元素,其中包含该变量中的值向量。

通过使用 do.call("cbind", mget(variables)) 将列表的元素绑定到列中,您可以将其放入 lag() 可用的结构中。据我所知,实际上没有必要将其包装在 as.zoo().

要获得适当的延迟,您需要 -lags 而不是 lags-1

把这些放在一起,你得到:

lagged <- lag(do.call("cbind", mget(variables)), -lags)

它包含每个变量的 1 和 3 滞后,因此您必须进行一些 post 处理才能获得所需的格式。以下应该这样做:

lagged <- lagged[, c("a.lag-1", "c.lag-3", "b.lag-1")]
colnames(lagged) <- c("a.l1", "c.l3", "b.l1")

请注意,由于在 1970 年 2 月 20 日所有滞后都是 NA,因此该行已从输出中排除。

我认为这可以通过将动物园数据绑定为 data.frame 然后从 dplyr 应用 mutate 然后将数据保存为动物园来轻松处理。

#cbind and apply mutate
x1<-data.frame(cbind(a,b,c))
x1$Date<-row.names(x1)
x2<-x1 %>%
mutate(a=lag(a,1),b=lag(b,3),c=lag(c,1))
#convert back to zoo object
x3<-zoo(x2,as.Date(x2$Date))
x3$Date<-NULL

head(x3)
           a           b          c         
1970-02-20 <NA>        <NA>       <NA>      
1970-02-21 -0.56047565 <NA>       -1.0678237
1970-02-22 -0.23017749 <NA>       -0.2179749
1970-02-23  1.55870831  1.2240818 -1.0260044
1970-02-24  0.07050839  0.3598138 -0.7288912
1970-02-25  0.12928774  0.4007715 -0.6250393