按data.table分组
假设我有一个包含一些棒球选手的数据表:
library(plyr) library(data.table) bdt <- as.data.table(baseball)
对于每个玩家(由ID给出),我想find对应他们玩最多游戏年份的行。 这在plyr中很简单:
ddply(baseball, "id", subset, g == max(g))
什么是data.table的等效代码?
我试过了:
setkey(bdt, "id") bdt[g == max(g)] # only one row bdt[g == max(g), by = id] # Error: 'by' or 'keyby' is supplied but not j bdt[, .SD[g == max(g)]] # only one row
这工作:
bdt[, .SD[g == max(g)], by = id]
但它只比plyr快30%,暗示它可能不是惯用的。
这里是快速的data.table
方法:
bdt[bdt[, .I[g == max(g)], by = id]$V1]
这避免了构build.SD
,这是expression式的瓶颈。
编辑:实际上,OP速度慢的主要原因不仅在于它具有.SD
,而且是以特定方式使用它的事实 – 通过调用目前拥有巨大开销的[.data.table
,所以在一个循环中运行(当一个人做一个循环时)积累了一个非常大的惩罚。