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

Interesting Posts