【问题标题】:aggregating multiple columns in data.table聚合 data.table 中的多个列
【发布时间】:2012-07-26 14:03:27
【问题描述】:

我有以下示例data.table

dtb <- data.table(a=sample(1:100,100), b=sample(1:100,100), id=rep(1:10,10))

例如,我想使用 colSums 按 ID 聚合所有列(a 和 b,尽管它们应该分开)。这样做的正确方法是什么?以下方法不起作用:

 dtb[,colSums, by="id"]

这只是一个示例,我的表有很多列,所以我想避免在函数名称中指定所有列

【问题讨论】:

    标签: r dataframe aggregate data.table


    【解决方案1】:

    这实际上是我一直在寻找的,并且在常见问题解答中提到:

    dtb[,lapply(.SD,mean),by="id"]
    

    【讨论】:

    • +1 这些,你完全正确,这绝对是更好的方法。我一直认为我应该拥有长格式的所有内容,但在这种情况下,经常进行计算会更有效率。您应该将自己的答案标记为正确答案。
    • +1 顺便说一句,此语法已在最新的 v1.8.2 中进行了优化。曾经像这样在j 中使用lapply 会降低速度,但现在不会了。已对data.table wiki 第 1 点进行了修改,需要对第 5 点进行修改。
    【解决方案2】:

    我想在这种情况下,首先将您的数据转换为长格式然后进行聚合是最快的(请参阅SO post 中的 Matthew 的 cmets):

    library(data.table)
    dtb <- data.table(a=sample(1:100,100), b=sample(1:100,100), id=rep(1:10,10))
    library(reshape2)
    dt_long <- as.data.table(melt(dtb, id.var="id"))
    dt_long[, sum(value), by=c("id","variable")]
        id variable  V1
     1:  1        a 601
     2:  2        a 440
     3:  3        a 496
     4:  4        a 553
     5:  5        a 444
     6:  6        a 466
     7:  7        a 525
     8:  8        a 553
     9:  9        a 541
    ...
    

    【讨论】:

    • 这似乎效率很低.. 有没有办法只选择 id 一次而不是每个变量一次?
    • 我很困惑...你说的效率低下是什么意思?代码太多或太慢?你是什​​么意思只选择一次id而不是每个变量一次?您不想要每个变量和 id 组合的总和吗?
    • 是的,没错。低效我的意思是代码必须通过数据框进行多少次搜索。除非我不了解 R 是如何做事的基础,否则使用向量运算,必须查找一次 id,然后跨列的总和作为向量运算完成。以您建议的方式, (id, variable) 每次都必须查找。在我的表中,我有大约 200 列,这样会有所作为。没有?
    猜你喜欢
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多