按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 ,所以在一个循环中运行(当一个人做一个循环时)积累了一个非常大的惩罚。