我的数据集有大约20个列,我想为20个当前列中的每一列创建7个新列,其中包含滞后数据。
例如,我有列x,y和z。我想为xlag1,xlag2,xlag3,xlag4,xlag5,xlag6,xlag7,ylag1,ylag2等创建一个列。
我目前的尝试是在R -
中使用dplyraq %>% 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中,因为我对包最熟悉。
答案 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
中的列并循环浏览数据集,获取shift
,unlist
并分配给新列
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)