You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用R data.table按id分组获取对应最大id2及val字段?

嘿,我来帮你搞定这个data.table分组取最大id2的需求~

首先明确你的需求:按id列分组,每个分组里拿到id2最大的那条记录(应该还要对应取出val列对吧?),SQL里确实用窗口函数或者分组聚合就能轻松实现,那咱们来看看data.table里的几种实现方式:

方法1:用.SD + which.max

这是最直观的写法,.SD代表每个分组的子数据集,which.max(id2)会找到该分组里id2最大的行的索引,直接取出这一行就行:

dt[, .SD[which.max(id2)], by = id]

方法2:排序后取分组最后一行

先按id和id2排序,每个分组里的最后一行就是id2最大的那条,用.N(每个分组的行数)来定位:

dt[order(id, id2), .SD[.N], by = id]

如果想让排序更高效,也可以用setorder原地排序后再处理:

setorder(dt, id, id2)
dt[, .SD[.N], by = id]

方法3:排序后去重(大数据集更高效)

这种方法适合数据量比较大的场景,先按id升序、id2降序排序,这样每个id的第一条就是id2最大的记录,然后用unique按id去重即可:

setorder(dt, id, -id2)
unique(dt, by = "id")

要是你只是需要每个分组最大的id2值(不需要对应的val),那更简单,直接聚合:

dt[, .(max_id2 = max(id2)), by = id]

对比SQL的写法,比如你可能会写:

SELECT id, id2, val
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY id2 DESC) rn
FROM your_table
) t
WHERE rn = 1

上面的data.table方法其实和这个SQL逻辑是对应的,只是用data.table的语法更简洁高效~

内容的提问来源于stack exchange,提问作者user3685285

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:17:36