【问题标题】:How to loop lapply to create LAG terms over multiple variables in R如何循环 lapply 以在 R 中的多个变量上创建 LAG 项
【发布时间】:2017-09-12 23:30:22
【问题描述】:

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

以如下数据表为例:

    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 项)都将不胜感激!

【问题讨论】:

    标签: r


    【解决方案1】:

    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
    

    【讨论】:

    • @agstudy 你能解释一下为什么我的回答不能满足这个问题吗?因为它没有以编程方式扩展到 N 滞后?
    • @agstudy 好的,我认为问题更多在于大量变量,但是是的,我的答案不适用于大量滞后。
    • 嗨@thelatemail,我想在这里用你的答案来解决另一个问题:如何用幂函数更改shift 函数? (vars 的每个元素都需要提高到rpv 的幂,其中rpv 是一个数字向量 - 所以函数返回 b^2、c^2、b^3、c^3 等)跨度>
    • @joeuk - 我认为如果您将 shift 替换为 `^` ,包括反引号,它应该可以工作。
    • @joeuk - 您可以先单独定义它将其声明为与 function(x,y) 等内联。只需确保您提供给 Map 的参数数量匹配函数的参数数量。
    【解决方案2】:

    这是使用dplyr 的一种方法:

    df %>%
        group_by(a) %>%
        mutate_all(funs(lag1 = lag(., 1), lag2 = lag(., 2)))
    

    输出:

           a         b        c    b_lag1   c_lag1   b_lag2   c_lag2
      <fctr>     <dbl>    <dbl>     <dbl>    <dbl>    <dbl>    <dbl>
    1      x  6.663691 689.2483        NA       NA       NA       NA
    2      x 11.759130 397.8902  6.663691 689.2483       NA       NA
    3      x  3.888010 467.9758 11.759130 397.8902 6.663691 689.2483
    4      y  6.221436 355.5437        NA       NA       NA       NA
    5      y  2.390940 701.2719  6.221436 355.5437       NA       NA
    6      y 17.141815 175.4642  2.390940 701.2719 6.221436 355.5437
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-22
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多