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. 61
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
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