【问题标题】:R data.table: sum of vectors in seperate columnsR data.table:不同列中向量的总和
【发布时间】:2017-04-06 18:30:14
【问题描述】:

我有一个带有向量的 data.table 或实际上在列单元格内列出了向量,即:

testDATA <- data.table('COLUMN_1' = list(1:4, 11:14, 21:24),
                       'COLUMN_ABC' = list(5:8, 25:28, 15:18),
                       'COLUMN1342' = list(2:5, 32:35, 22:25))

此外,我还有一个向量,其中包含我想要求和的向量元素的列名称,即:

columnsToSum <- c('COLUMN_ABC', 'COLUMN1342')

如何将列添加到 data.table 中,它将对 columnsToSum 中定义的列中的向量元素求和,以便在第一行中我将拥有向量 c(6,8,10,12) ?我知道我可以像这样对两个向量求和:

testDATA[, sumCol := list(Map(function(x,y) x + y, get('COLUMN_ABC'), get('COLUMN1342')))]

虽然问题是我有所有列,我应该在 columnsToSum 向量中求和。有什么想法吗?

【问题讨论】:

    标签: r list vector data.table


    【解决方案1】:

    我认为这应该适合你

    testDATA[, sumCol := Reduce(function(a,b) Map(`+`,a,b), .SD), 
        .SDcols=columnsToSum]
    

    我们使用.SD从数据表中获取一组列,然后我们使用Reduce()将它们依次相加,并使用Map()将每一行分别相加。它适用于超过 2 列

    columnsToSum <- names(testDATA)
    testDATA[, sumCol := Reduce(function(a,b) Map(`+`,a,b), .SD), .SDcols=columnsToSum]
    testDATA
    #       COLUMN_1  COLUMN_ABC  COLUMN1342          sumCol
    # 1:     1,2,3,4     5,6,7,8     2,3,4,5     23,31,39,47
    # 2: 11,12,13,14 25,26,27,28 32,33,34,35 193,201,209,217
    # 3: 21,22,23,24 15,16,17,18 22,23,24,25 153,161,169,177
    

    【讨论】:

    • 谢谢!你能解释一下为什么这里需要 inherits=TRUE 吗?
    • this issue相关。 get()mget() 在搜索变量时具有不同的行为。
    • 非常感谢!如果我有两个向量 columnsToSum1 和 columnsToSum2 并且我想将它们相乘为一个新列(即 columnsToSum1 的第一列 * columnsToSum2 的第一列 + 第二个等),你能否给我一个线索?我应该问新问题吗?
    • 那是非常不同的。我会问一个新问题。确保它可以独立站立。
    猜你喜欢
    • 2021-04-21
    • 2016-11-03
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    相关资源
    最近更新 更多