Ho notato che cbind richiede molto più tempo di rbind per data.tables. Qual è la ragione di questo?cbind vs rbind con data.table
> dt <- as.data.table(mtcars)
> new.dt <- copy(dt)
> timeit({for (i in 1:100) dt.new <- rbind(dt.new, dt)})
user system elapsed
0.237 0.012 0.253
> new.dt <- copy(dt)
> timeit({for (i in 1:100) dt.new <- cbind(dt.new, dt)})
user system elapsed
14.795 0.090 14.912
Dove
timeit <- function(expr)
{
ptm <- proc.time()
expr
proc.time() - ptm
}
non so la struttura interna di data.table, ma credo che l'aggiunta di nuovi record (righe) è più facile di ristrutturare la tabella con nuove variabili (colonne). – zx8754
@ zx8754 Sì, anch'io sono d'accordo con il mio sospetto, curioso di sapere quale sia il collo della bottiglia specifico. Forse è l'allocazione di memoria, forse maggiori requisiti di memoria, si spera che qualcuno famoso con il nocciolo del pacchetto possa far luce ... – andrew
A meno che non mi sbagli, chiamare 'rbind' su un' data.table' invierà 'rbind.data. table', che chiama la funzione 'data.table'' rbindlist'- implementata in C, e molto veloce. Vedi la risposta @ Arun [qui] (http://stackoverflow.com/questions/15673550/why-is-rbindlist-better-than-rbind). Inoltre, ci sono quasi certamente delle differenze fondamentali tra le modifiche a livello di colonna e le modifiche a livello di riga (riguardo al modo in cui gli oggetti sono archiviati in memoria), quindi non si tratta di un confronto "da mele a mele". Molto probabilmente questo è il motivo per cui 'data.table 'implementa': = 'per modificare le colonne in modo efficiente. – nrussell