r data.table greatest-n-per-group

Subconjunto por grupo con data.table



greatest-n-per-group (1)

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.

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.