Podzbiór wierszy odpowiadających wartości maksymalnej według grupy wykorzystującej dane.tabela

Załóżmy, że mam data.table zawierające kilku baseballistów:

library(plyr)
library(data.table)

bdt <- as.data.table(baseball)

Dla każdej grupy (podanej przez ID gracza) chcę wybrać wiersze odpowiadające maksymalnej liczbie gier "g". Jest to proste w plyr:

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

Jaki jest równoważny kod dla data.table?

Próbowałem:

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

To działa:

bdt[, .SD[g == max(g)], by = id] 
Ale jest tylko o 30% szybszy niż plyr, co sugeruje, że prawdopodobnie nie jest idiomatyczny.
Author: Henrik, 2013-05-15

1 answers

Oto szybki data.table sposób:

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

Pozwala to uniknąć konstruowania .SD, co jest wąskim gardłem w wyrażeniach.

Edit: właściwie, głównym powodem, dla którego OP jest powolny, nie jest tylko to, że ma w sobie .SD, ale fakt, że używa go w szczególny sposób - wywołując [.data.table, które w tej chwili ma ogromny narzut, więc uruchamianie go w pętli (gdy robi się by), kumuluje bardzo dużą karę.

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