在data.table中使用`by`变量以组

时间:2017-02-08 20:00:06

标签: r data.table

我想知道是否有任何方法可以在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来做这个?

0 个答案:

没有答案