基于变量名称向量创建一个新的动物园对象
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
设置种子和变量。请假设一切都是这样 部分是给定的且不可更改。
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