【问题标题】:lapply - create new variables with variations of .SDcolslapply - 创建具有 .SDcols 变体的新变量
【发布时间】:2020-06-22 15:25:40
【问题描述】:

我有一个大型数据集,其中包含一些感兴趣的核心变量,我需要计算许多不同的操作。我在数据表dt 中有这些变量的向量cols,我正在尝试使用lapply 创建新变量。在创建需要使用数据表中多个现有变量的新变量时,我遇到了麻烦,这些变量的名称是围绕核心变量构建的。这是一个例子(代码在这里运行):

dt = data.table( id = c(1,1,2,2,3,3), x = 1:6, y = 7:12, z = 13:18) ## example data
cols = c("x","y","z") ## my list of variables
dt[ , paste0(cols, ".avg") := lapply(.SD, function(x) mean(x, na.rm = T)), by = .(id), .SDcols = cols]

我想继续以这种方式创建新变量,但我很难引用通过前面的lapply 步骤创建的新列。我想计算列xx.avg 之间的差异,但我一直遇到错误。我尝试了以下变体,所有这些都会导致错误:

dt[ , paste0(cols,".diff") := lapply(.SD, function(x) x-eval(paste0(x,".avg"))), .SDcols = cols]
Error in x-eval(paste0(x,".avg")) :
    non-numeric argument to binary operator

我想要一个等同于以下内容的lapply 步骤:

dt[ ':=' (x.diff = x-x.avg, 
          y.diff = y-y.avg,
          z.diff = z-z.avg)]

提前致谢!

【问题讨论】:

    标签: r data.table lapply


    【解决方案1】:

    如果你想坚持使用[],你可以使用Mapmget

    dt[, paste0(cols, '.diff') := Map(function(var, avg) var - avg,
                                     mget(cols), 
                                     mget(paste0(cols, '.avg')))]
    
    dt
    #    id x  y  z x.avg y.avg z.avg x.diff y.diff z.diff
    # 1:  1 1  7 13   1.5   7.5  13.5   -0.5   -0.5   -0.5
    # 2:  1 2  8 14   1.5   7.5  13.5    0.5    0.5    0.5
    # 3:  2 3  9 15   3.5   9.5  15.5   -0.5   -0.5   -0.5
    # 4:  2 4 10 16   3.5   9.5  15.5    0.5    0.5    0.5
    # 5:  3 5 11 17   5.5  11.5  17.5   -0.5   -0.5   -0.5
    # 6:  3 6 12 18   5.5  11.5  17.5    0.5    0.5    0.5
    

    在这个例子中,你的匿名函数只是减法,所以你可以更简洁地写成

    dt[, paste0(cols, '.diff') := Map('-', mget(cols), mget(paste0(cols, '.avg')))]
    

    【讨论】:

      【解决方案2】:

      使用set() 代替.SDcols...

      cols <- c("x", "y", "z")
      for (col in cols) {
        set(dt, j = paste0(col, ".diff"), value = dt[[col]] - dt[[paste0(col, ".avg")]])
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        • 2018-06-05
        • 1970-01-01
        • 1970-01-01
        • 2013-08-18
        • 2020-11-21
        • 1970-01-01
        相关资源
        最近更新 更多