【问题标题】:Accessing column name within the SD construct访问 SD 结构中的列名
【发布时间】:2019-12-30 17:59:32
【问题描述】:

我在 R 中有一个如下所示的数据表

DT = data.table(a = c(1,2,3,4,5), a_mean = c(1,1,2,2,2), b = c(6,7,8,9,10), b_mean = c(3,2,1,1,2))

我想再创建两列 a_final 和 b_final,分别定义为 a_final = (a - a_mean) 和 b_final = (b - b_mean)。在我的实际用例中,可能会有大量这样的列对,我想要一个本着 R 数据表精神的可扩展解决方案。

我尝试了一些类似

的方法
DT[,paste0(c('a','b'),'_final') := lapply(.SD, function(x) ((x-get(paste0(colnames(.SD),'_mean'))))), .SDcols = c('a','b')]

但这并不完全奏效。知道如何访问 lapply 语句中正在处理的列的列名吗?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们可以创建一个带有列名的字符向量,从原始 data.table 中对其进行子集化,获取它们对应的“平均”列,减去和添加为新列。

    library(data.table)
    cols <- unique(sub('_.*', '', names(DT))) #Thanks to @Sotos
    #OR just
    #cols <- c('a', 'b')
    
    DT[,paste0(cols, '_final')] <- DT[,cols, with = FALSE] - 
                                   DT[,paste0(cols, "_mean"), with = FALSE] 
    DT
    #   a a_mean  b b_mean a_final b_final
    #1: 1      1  6      3       0       3
    #2: 2      1  7      2       1       5
    #3: 3      2  8      1       1       7
    #4: 4      2  9      1       2       8
    #5: 5      2 10      2       3       8
    

    【讨论】:

    • unique(sub('_.*', '', names(DT))) 对于cols 来说更笼统(正如 OP 提到的大约 30 个冷却器)
    • @Sotos 是的,有道理。更新了答案。谢谢:)
    • 谢谢...非常着迷于让它在 lapply 构造中工作,以至于我没有想到像你所做的那样将数据分成两部分
    【解决方案2】:

    另一种选择是使用mgetMap

    cols <- c('a', 'b')
    DT[, paste0(cols,'_final') := Map(`-`, mget(cols), mget(paste0(cols,"_mean")))]
    

    【讨论】:

      【解决方案3】:

      依靠.SD construct,您可以执行以下操作:

      cols <- c('a', 'b')
      DT[, paste0(cols, "_final") := 
            DT[, .SD, .SDcols = cols] - 
            DT[, .SD, .SDcols = paste0(cols, "_mean")]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        相关资源
        最近更新 更多