1

我有以下(简化的)数据集:

df <- data.frame(a=c("A","A","B","B","B"),x=c(1,2,3,3,4))
df
  a x
1 A 1
2 A 2
3 B 3
4 B 3
5 B 4

由于我正在处理大型数据集,因此我使用 data.table 包。

有没有办法在 df 中获取这些行,其中 x 是由 a 分组的最小值。所以在这种情况下,我想选择第 1,3 和 4 行。

就像是

df[,min(x),by=a]

但这并没有给我想要的线条,它只是向我展示了按 a 分组的 x 的最小值。

有什么建议么?

4

2 回答 2

6
library(data.table)
dt <- data.table(a=c("A","A","B","B","B"), x=c(1,2,3,3,4))

这些只给出唯一的行:

dt[, .SD[which.min(x)], by=a]

或者:

setkeyv(dt, c("a","x"))
dt[unique(dt[,a]), mult="first"]

既然你想拥有所有的关系:

dt[,.SD[x==min(x)], by=a]

您还可以使用:

setkeyv(dt,c("a","x"))
dt[dt[unique(dt[,a]), mult="first"]]

如果您有非常大的团体,这可能会更有效。

于 2013-08-09T08:16:47.490 回答
1

干得好

R) dt <- data.table(a=c("A","A","B","B","B"),x=c(1,2,3,3,4))
R) dt[dt[,list(IDX=.I[x==min(x)]),by=a]$IDX]
   a x
1: A 1
2: B 3
3: B 3

如果您想要领带,那应该会更快(正如我所理解的那样)

于 2013-08-09T13:21:30.050 回答