Subconjunto por grupo con datos.tabla


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 más juegos. Esto es sencillo en plyr:

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

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

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 es idiomático.

Author: Bulat, 2013-05-16

1 answers

Aquí está el camino rápido data.table:

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

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

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

 57
Author: eddi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-12 20:35:03