如何循环lapply以在R中的多个变量上创建LAG术语

时间:2017-09-12 23:30:23

标签: r

对于我正在构建的模型,我想为数据表中的每个字段/向量创建多个滞后项:

例如,使用以下数据表:

    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术语)将不胜感激!

2 个答案:

答案 0 :(得分:4)

data.tableMap来处理循环:

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)))