【问题标题】:data.table sum by group and return row with max valuedata.table 按组求和并返回具有最大值的行
【发布时间】:2015-03-23 13:42:31
【问题描述】:

我有一个这样的data.table:

dd <- data.table(f = c("a", "a", "a", "b", "b"), g = c(1,2,3,4,5))
dd

我需要将值g 与因子f 相加,最后返回一个最大值为g 的单行data.table 对象,但其中也包含因子信息。即

___f|g   
1: b 9

到目前为止我最接近的尝试是

tmp3 <- dd[, sum(g), by = f][, max(V1)]
tmp3

结果:

> tmp3
[1] 9

编辑:理想情况下,我正在寻找纯粹的 data.table 代码/工作流程。令我惊讶的是,凭借所有快速的拆分-应用-组合向导以及以“示例 [i = 子集,]”的形式对数据进行子集化的能力,我还没有找到一种直接的方法来对单个子集进行子集化值条件。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    这是一种方法:

    library(data.table)
    dd <- data.table(
      f = c("a", "a", "a", "b", "b"), 
      g = c(1,2,3,4,5))
    ##
    > dd[,list(g = sum(g)),by=f][which.max(g),]
       f g
    1: b 9
    

    【讨论】:

    • 效果很好,虽然我很惊讶这是多么的复杂。我最初(不成功)的尝试集中在第一个 data.table 参数i,我认为这主要是为了选择您的数据。
    • 我确实使用了i 参数来选择最终结果:[which.max(g),]。我的答案可以通过dd[,sum(g),by=f][which.max(V1),] 缩短一点,但我使用list(g = ... ) 来保留列名。
    • 对不起,这是回答我的问题的更好方法:)
    【解决方案2】:

    您可以在 data.table 上使用dplyr 语法,在这种情况下:

    library(dplyr)
    dd %>%
      group_by(f) %>%
      summarise (g = sum(g)) %>%
      top_n(1, g)
    
    Source: local data table [1 x 2]
    
      f g
    1 b 9
    

    【讨论】:

    • 有效,但我很好奇如何以纯粹的 data.table 方式解决此问题。令我惊讶的是,聚合和分组可以在一个 data.table 命令中完成,最后一部分需要一些不同的东西。
    猜你喜欢
    • 2015-09-24
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多