基于变量名称向量创建新的zoo对象

时间:2015-03-05 19:17:24

标签: r get lag zoo

设置种子和变量。请假设一切都是这个 部分是不可改变的。

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")

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

                   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

这是我能找到的最接近的,但它不起作用。问题出在&#34; get&#34;功能我认为。

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

非常感谢

2 个答案:

答案 0 :(得分:0)

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

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

要获得适当的滞后,您需要-lags而不是lags-1

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

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

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

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

请注意,因为在1970-02-20所有滞后都是NA,所以此行将从输出中排除。

答案 1 :(得分:0)

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

#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