Da v1.9.2, si rbindlistera evoluto un po ', implementando molte funzionalità tra cui:
- Scelta
SEXPTYPEdella colonna più alta durante l'associazione - implementata nella v1.9.2chiusura di FR # 2456 e Bug # 4981 .
- Gestire
factorcorrettamente le colonne - implementato per la prima volta nella v1.8.10chiusura del Bug # 2650 e esteso anche ai vincoli dei fattori ordinativ1.9.2 , chiudendo anche FR # 4856 e Bug # 5019 .
Inoltre, in v1.9.2, ha rbind.data.tableanche ottenuto un fillargomento, che consente di legare riempiendo le colonne mancanti, implementato in R.
Ora in v1.9.3, ci sono ancora più miglioramenti su queste funzionalità esistenti:
rbindlistottiene un argomento use.names, che per impostazione predefinita è FALSEper compatibilità con le versioni precedenti.
rbindlistottiene anche un argomento fill, che per impostazione predefinita è anche FALSEper compatibilità con le versioni precedenti.
- Queste funzionalità sono tutte implementate in C e scritte attentamente per non scendere a compromessi in termini di velocità durante l'aggiunta di funzionalità.
- Dal momento che
rbindlistora possono abbinare i nomi e riempire le colonne mancanti, rbind.data.tablechiama solo rbindlistora. L'unica differenza è quella use.names=TRUEdi default per rbind.data.table, per compatibilità con le versioni precedenti.
rbind.data.framerallenta un po 'per lo più a causa delle copie (che sottolinea anche @mnel) che potrebbero essere evitate (spostandosi su C). Penso che non sia l'unica ragione. L'implementazione per il controllo / corrispondenza dei nomi delle colonne rbind.data.framepotrebbe anche rallentare quando ci sono molte colonne per data.frame e ci sono molti di tali data.frames da associare (come mostrato nel benchmark di seguito).
Tuttavia, tale rbindlistmancanza (ed) alcune funzionalità (come il controllo dei livelli dei fattori o la corrispondenza dei nomi) ha un peso molto piccolo (o nullo) perché è più veloce di rbind.data.frame. È perché sono stati accuratamente implementati in C, ottimizzati per velocità e memoria.
Ecco un punto di riferimento che evidenzia l'associazione efficiente durante la corrispondenza per nomi di colonna e utilizzando rbindlistla use.namesfunzione di v1.9.3. Il set di dati è composto da 10000 data.frames ciascuno di dimensioni 10 * 500.
NB: questo benchmark è stato aggiornato per includere un confronto a dplyr'sbind_rows
library(data.table) # 1.11.5, 2018-06-02 00:09:06 UTC
library(dplyr) # 0.7.5.9000, 2018-06-12 01:41:40 UTC
set.seed(1L)
names = paste0("V", 1:500)
cols = 500L
foo <- function() {
data = as.data.frame(setDT(lapply(1:cols, function(x) sample(10))))
setnames(data, sample(names))
}
n = 10e3L
ll = vector("list", n)
for (i in 1:n) {
.Call("Csetlistelt", ll, i, foo())
}
system.time(ans1 <- rbindlist(ll))
# user system elapsed
# 1.226 0.070 1.296
system.time(ans2 <- rbindlist(ll, use.names=TRUE))
# user system elapsed
# 2.635 0.129 2.772
system.time(ans3 <- do.call("rbind", ll))
# user system elapsed
# 36.932 1.628 38.594
system.time(ans4 <- bind_rows(ll))
# user system elapsed
# 48.754 0.384 49.224
identical(ans2, setDT(ans3))
# [1] TRUE
identical(ans2, setDT(ans4))
# [1] TRUE
Il collegamento delle colonne in quanto tale senza il controllo dei nomi ha richiesto solo 1,3, mentre il controllo dei nomi delle colonne e l'associazione in modo appropriato hanno richiesto solo 1,5 secondi in più. Rispetto alla soluzione base, è 14 volte più veloce e 18 volte più veloce della dplyrversione.
attr<-,class<-e (penso)rownames<-tutti modificano sul posto.