使用data.table包选择特定行

时间:2013-08-09 08:09:27

标签: r data.table

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

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]

但是这并没有给我我想拥有的线条,它只是向我显示x分组的最小值。

有什么建议吗?

2 个答案:

答案 0 :(得分: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"]]

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

答案 1 :(得分: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

如果你想要领带(我理解你想要的话),这应该更快