设置种子和变量。请假设一切都是这个 部分是不可改变的。
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)
非常感谢
答案 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