按组求和并返回具有最大值的行的data.table

3

I have a data.table in this fashion:

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

我需要按照因子f对值g进行求和,最后返回一个包含g的最大值和因子信息的单行数据表对象。
___f|g   
1: b 9

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

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

这将导致:
> tmp3
[1] 9

编辑:我希望找到一份纯粹的data.table代码/工作流程。我很惊讶,尽管有快速拆分-应用-合并技巧和以'example[i= subset, ]`形式对数据进行子集操作的能力,但我还没有找到一种简单的方式来根据单个值条件进行子集操作。

2个回答

6
这里是一种实现方法:
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,我认为它主要用于选择数据。 - DaveRGP
2
我使用了 i 参数来选择最终结果:[which.max(g),]。通过执行 dd[,sum(g),by=f][which.max(V1),],我的答案可以缩短一些,但是我使用了 list(g = ... ) 来保留列名。 - nrussell
1
抱歉,这是更好的回答我的问题的方式 :) - DaveRGP

5

您可以在一个数据表上使用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命令中完成,最后一部分却需要完全不同的东西。 - DaveRGP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接