Subconjunto de filas correspondientes al valor máximo por grupo usando data.table

Resuelto hadley asked hace 54 años • 1 respuestas

Supongamos que tengo un archivo data.tableque 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.

hadley avatar Jan 01 '70 08:01 hadley
Aceptado

Esta es la data.tableforma 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.

eddi avatar May 15 '2013 20:05 eddi