如何用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
相关产品推荐
相关产品推荐

