使用所有当前变量的滞后数据创建新变量
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
中的列并循环遍历数据集,获取 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]
我们也可以在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)
我的数据集大约有 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
中的列并循环遍历数据集,获取 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]
我们也可以在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)