Subconjunto de filas correspondientes al valor máximo por grupo usando data.table
Supongamos que tengo un archivo data.table
que contiene algunos jugadores de béisbol:
library(plyr)
library(data.table)
bdt <- as.data.table(baseball)
Para cada grupo (dado por el jugador 'id'), quiero seleccionar filas correspondientes al número máximo de juegos 'g'. Esto es sencillo en plyr
:
ddply(baseball, "id", subset, g == max(g))
¿Cuál es el código equivalente paradata.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 sólo un 30% más rápido que plyr
, lo que sugiere que probablemente no sea idiomático.
Esta es la data.table
forma rápida:
bdt[bdt[, .I[g == max(g)], by = id]$V1]
Esto evita la construcción .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 que lo tiene .SD
, sino el hecho de que lo usa de una manera particular: llamando a [.data.table
, que en este momento tiene una sobrecarga enorme, por lo que lo ejecuta en un bucle. (cuando uno hace un by
) acumula una penalización muy grande.