使用所有当前变量的滞后数据创建新变量

Create new variables with lag data from all current variables

我的数据集大约有 20 列,我想为当前 20 列中的每一列创建 7 个包含滞后数据的新列。

例如,我有 x、y 和 z 列。我想为 xlag1、xlag2、xlag3、xlag4、xlag5、xlag6、xlag7、ylag1、ylag2 等创建一个列。

我目前的尝试是在 R 中使用 dplyr -

aq %>% mutate(., 
          xlag1 = lag(x, 1),
          xlag2 = lag(x, 2),
          xlag3 = lag(x, 3),
          xlag4 = lag(x, 4),
          xlag5 = lag(x, 5),
          xlag6 = lag(x, 6),
          xlag7 = lag(x, 7),
          )

如您所见,需要大量代码行才能覆盖所有 20 列。有没有更有效的方法来做到这一点?如果可能的话,在 dplyr 和 R 中,因为我最熟悉这个包。

我们可以使用data.table。来自 data.table 的 shift 可以采用 'n'.

的序列
library(data.table)
setDT(aq)[, paste0('xlag', 1:7) := shift(x, 1:7)]

如果有多个列,

setDT(aq)[, paste0(rep(c("xlag", "ylag"), each = 7), 1:7) := 
                 c(shift(x, 1:7), shift(y, 1:7))]

如果我们有很多列,那么指定 .SDcols 中的列并循环遍历数据集,获取 shiftunlist 并分配给新列

setDT(aq)[, paste0(rep(c("xlag", "ylag"), each = 7), 1:7) := 
   unlist(lapply(.SD, shift, n = 1:7), recursive = FALSE) , .SDcols = x:y]

我们也可以在dplyr

中使用shift
library(dplyr)
aq %>% 
    do(setNames(data.frame(., shift(.$x, 1:7)), c(names(aq), paste0('xlag', 1:7))))

对于多列

aq %>%
  do(setNames(data.frame(., shift(.$x, 1:7), shift(.$y, 1:7)), 
         c(names(aq), paste0(rep(c("xlag", "ylag"), each = 7), 1:7) )))

数据

aq <- data.frame(x = 1:20, y  = 21:40)