在R

时间:2019-01-24 21:32:08

标签: r time-series lag

我有两个具有相同日期的时间序列数据帧(可以说这些数据帧称为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天的滞后,那将变得非常累人。

2 个答案:

答案 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))