我想知道是否有任何方法可以在data.tables中使用分组来从每个组中选择行。解释我正在寻找什么的最简单的方法是通过一个最小的例子。
1)可以使用的玩具data.table:
set.seed(123)
mydt = data.table(
grp = rep(LETTERS[1:5], each = 20),
site = rep(letters[1:20], 5),
V1 = rnorm(100))
2)这不起作用:
现在假设我们想从每个grp
组中提取V1,其中V1是最小的。下面的最终方法失败的原因很明显:
mydt[which.min(V1), .(site, V1), by=grp]
# grp site V1
# 1: D l -2.309169
这只返回一个值(整个表中的最小V1),因为i
上的子集在循环by
之前进行。而我们真正想要的是每组中最小的一行。
3)这确实有效,但很糟糕:
res = data.table()
for (mygrp in unique(mydt[,grp])) {
smallest = mydt[grp == mygrp, which.min(V1)]
res = rbind(res, mydt[grp == mygrp][smallest])
}
# grp site V1
# 1: A r -1.966617
# 2: B f -1.686693
# 3: C q -1.548753
# 4: D l -2.309169
# 5: E t -1.026421
4)有更好的方法吗?
是否有更规范的data.table样式apporach来做这个?