O per essere più generale, è DT[,.SD[...],by=...]
versus merge(aggregate(...))
.R: performance data.table vs merge (aggregate())
Senza ulteriori indugi, ecco i dati e l'esempio:
set.seed(5141)
size = 1e6
df <- data.table(a = rnorm(size),
b = paste0(sample(letters, size, T),
sample(letters, size, T),
sample(letters, size, T)),
c = sample(1:(size/10), size, T),
d = sample(seq.Date(as.Date("2015-01-01"),
as.Date("2015-05-31"), by="day"), size, T))
system.time(df[,.SD[d == max(d)], by = c])
# user system elapsed
# 50.89 0.00 51.00
system.time(merge(aggregate(d ~ c, data = df, max), df))
# user system elapsed
# 18.24 0.20 18.45
solito avendo alcun problema con data.table
prestazioni, mi sono sorpreso da questo particolare esempio. Ho dovuto sommare (aggregare) un frame di dati abbastanza grande prendendo solo le ultime (possono essere simultanee) occorrenze di alcuni tipi di eventi. E mantieni il resto dei dati rilevanti per quegli eventi particolari. Tuttavia, sembra che .SD
non si adatti bene a questa particolare applicazione.
Esiste un "modo tabella dati" migliore per affrontare questo tipo di attività?
È interessante notare che 'df [, is_max: = d == max (d), per = c] [is_max == T,]' gira molto velocemente sulla mia macchina. – Heroka
Questa sembra essere la soluzione più veloce finora. Sarebbe possibile fare la stessa cosa senza creare la colonna in più? –
Non lo so, si può sempre cancellarlo in seguito 'df [, is_max: = d == max (d), per = c] [is_max == T,] [, is_max: = NULL,]'. E la soluzione di join fornita da @Akrun è di gran lunga la più veloce. – Heroka