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

时间:2016-07-21 03:21:08

标签: r variables dplyr lag

我的数据集有大约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中,因为我对包最熟悉。

1 个答案:

答案 0 :(得分:2)

我们可以使用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]

我们还可以使用shift

中的dplyr
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)