我有两个具有相同日期的时间序列数据帧(可以说这些数据帧称为df1和df2)。我想向df1添加多列,其中包含来自df2的滞后谷地
我已经尝试过滞后功能,但是它只会在1列中打印出1个滞后。
创建2个数据帧
Date <- seq.Date(as.Date("2004-01-01"), as.Date("2004-01-06"), by ="day")
df1 <- data.frame(
Date,
Price = sample(c(1:9), length(Date), replace = TRUE))
df2 <- data.frame(
Date,
Catch = c(sample(c(1:100), 2, replace = TRUE), NA,
sample(c(1:100), 2, replace = TRUE), NA))
我的df1和df2看起来像
>df1
Date Price
>1 2004-01-01 2
>2 2004-01-02 4
>3 2004-01-03 7
>4 2004-01-04 9
>5 2004-01-05 6
>6 2004-01-06 9
>df2
Date Catch
>1 2004-01-01 95
>2 2004-01-02 14
>3 2004-01-03 NA
>4 2004-01-04 100
>5 2004-01-05 87
>6 2004-01-06 NA
我尝试使用lag函数:
df1$lag_catch_01 <- lag(df2$Catch, k = 1)
这给了我:
Date Price lag_catch
>1 2004-01-01 2 NA
>2 2004-01-02 4 95
>3 2004-01-03 7 14
>4 2004-01-04 9 NA
>5 2004-01-05 6 100
>6 2004-01-06 9 87
但是我真的想要这样的输出:
Date Price lag_catch_01 lag_catch_02
>1 2004-01-01 2 NA NA
>2 2004-01-02 4 95 NA
>3 2004-01-03 7 14 95
>4 2004-01-04 9 NA 14
>5 2004-01-05 6 100 NA
>6 2004-01-06 9 87 100
我想我可以像这样多次使用滞后函数:
df1$lag_catch_01 <- lag(df2$Catch, k = 1)
df1$lag_catch_02 <- lag(df2$Catch, k = 2)
但是,如果我想制作20列,每列都有20天的滞后,那将变得非常累人。
答案 0 :(得分:1)
您可以使用plyr
在自己的data.frame中计算滞后,然后将它们合并:
library(plyr)
library(dplyr)
df1 %>% bind_cols(data.frame(t(ldply(1:4, lag, x= (df2$Catch)))))
因此ldply(1:4, lag, x= (df2$Catch)
是针对列表(ldply中的l)的1:4应用函数lag并返回一个data.frame(ldply中的d),末尾带有其他命名参数。剩下的只是整理一下,在这种情况下,创建的data.frame是错误的方法
答案 1 :(得分:0)
假定这两个滞后可以正常工作,但是需要动态地扩展滞后的数量,只需使用sapply
将新列分配给矩阵输出即可:
df1[paste0("lag_catch_", 1:20)] <- sapply(1:20, function(i) lag(df2$Catch, k = i))