Subconjunto por grupo con data.table

Supongamos que tengo una tabla de datos que contiene algunos jugadores de béisbol:

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

Para cada jugador (dado por id), quiero encontrar la fila correspondiente al año en el que jugaron la mayoría de los juegos. Esto es sencillo en plyr:

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

¿Cuál es el código equivalente para data.table?

Lo intenté:

 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 

Esto funciona:

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

Pero es solo un 30% más rápido que plyr, lo que sugiere que probablemente no sea idiomático.

Aquí está la forma rápida de datos. data.table :

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

Esto evita construir .SD , que es el cuello de botella en sus expresiones.

editar: en realidad, la razón principal por la que el OP es lento no es solo porque tiene .SD en él, sino por el hecho de que lo usa de una manera particular – llamando a [.data.table , que en este momento tiene una gran sobrecarga , por lo que ejecutarlo en un bucle (cuando uno hace un by ) acumula una penalización muy grande.