67

假设我有一个data.table包含一些棒球运动员:

library(plyr)
library(data.table)

bdt <- as.data.table(baseball)

对于每个组(由玩家“id”给出),我想选择与最大游戏数“g”相对应的行。这很简单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] 

但它只比 快 30% plyr,这表明它可能不是惯用的。

4

1 回答 1

84

这是快速的data.table方法:

bdt[bdt[, .I[g == max(g)], by = id]$V1]

这避免了构造.SD,这是表达式中的瓶颈。

编辑:实际上,OP 速度慢的主要原因不仅在于它包含.SD在其中,还在于它以特定方式使用它——通过调用[.data.table,目前它的开销很大,因此在循环中运行它(当一个人做 a 时by)会累积非常大的惩罚。

于 2013-05-15T20:16:05.120 回答