假设我有一个包含一些棒球运动员的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] 但它只比plyr快30%,这表明它可能还不是通用的。
发布于 2013-05-16 04:16:05
下面是快速data.table的方法:
bdt[bdt[, .I[g == max(g)], by = id]$V1]这避免了构造.SD,这是表达式中的瓶颈。
edit:实际上,OP很慢的主要原因不仅仅是它有.SD在里面,还有它以一种特殊的方式使用它的事实-通过调用[.data.table,这在当时有一个巨大的开销,所以在一个循环中运行它(当一个人做by的时候)积累了非常大的代价。
https://stackoverflow.com/questions/16573995
复制相似问题