对于我正在构建的模型,我想为数据表中的每个字段/向量创建多个滞后项:
例如,使用以下数据表:
a<-c('x','x','x','y','y','y')
b<-runif(6, min=0, max=20)
c<-runif(6, min=50, max=1000)
df<-as.data.table(data.frame(a,b,c))
我可以使用以下代码为每个组 a 中的变量 b 创建2个滞后期限:
df[,c(paste("b","_L",1:2,sep="")):=lapply(1:2, function(i) c(rep(NA, i),head(b, -i))),by=a]
然而,当我尝试将此代码应用于大型数据表(100多个变量)时,我的问题出现了,我不想重复100行代码(每个变量1行)。
我试图将代码放在一个带有变量名列表的循环中,但是列表中的变量名似乎无法被识别或正确传递到代码中:
looplist <- colnames(df[,!1])
for (l in looplist) {
df[,c(paste(l,"_L",1:2,sep="")):=lapply(1:2, function(i) c(rep(NA, i),head(l, -i))),by=a]
}
关于如何使这个循环跨变量工作的任何建议,或任何其他方法来实现相同的目标(为数据表中的每个变量创建多个LAG术语)将不胜感激!
答案 0 :(得分:4)
data.table
和Map
来处理循环:
vars <- c("b","c")
rpv <- rep(1:2, each=length(vars))
df[, paste(vars, "lag", rpv, sep="_") := Map(shift, .SD, rpv), by=a, .SDcols=vars]
# a b c b_lag_1 c_lag_1 b_lag_2 c_lag_2
#1: x 10.863180 393.9568 NA NA NA NA
#2: x 6.139258 537.9199 10.863180 393.9568 NA NA
#3: x 11.896448 483.8036 6.139258 537.9199 10.86318 393.9568
#4: y 18.079188 509.6136 NA NA NA NA
#5: y 5.463224 233.6991 18.079188 509.6136 NA NA
#6: y 6.363724 869.8406 5.463224 233.6991 18.07919 509.6136
答案 1 :(得分:2)
以下是 catch (System.Exception ex)
{
throw;
}
:
dplyr
输出:
df %>%
group_by(a) %>%
mutate_all(funs(lag1 = lag(., 1), lag2 = lag(., 2)))