我有以下(简化)数据集:
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分组的最小值。
有什么建议吗?
答案 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
如果你想要领带(我理解你想要的话),这应该更快