Subconjunto por grupo com data.table

Suponha que eu tenha uma tabela de dados contendo alguns jogadores de beisebol:

library(plyr) library(data.table) bdt <- as.data.table(baseball) 

Para cada jogador (dado por id), eu quero encontrar a linha correspondente ao ano em que eles jogaram mais jogos. Isso é direto em plyr:

 ddply(baseball, "id", subset, g == max(g)) 

Qual é o código equivalente para data.table?

Eu tentei:

 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 

Isso funciona:

 bdt[, .SD[g == max(g)], by = id] 

Mas é apenas 30% mais rápido que o plyr, sugerindo que provavelmente não é idiomático.

Aqui está a maneira mais rápida de data.table :

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

Isso evita a construção de .SD , que é o gargalo nas suas expressões.

edit: Na verdade, a principal razão pela qual o OP é lento não é apenas que ele tem .SD nele, mas o fato de usá-lo de uma maneira particular – chamando [.data.table , que no momento tem uma enorme sobrecarga , então executá-lo em um loop (quando um faz um by ) acumula uma penalidade muito grande.