Da v1.9.2
, si rbindlist
era evoluto un po ', implementando molte funzionalità tra cui:
- Scelta
SEXPTYPE
della colonna più alta durante l'associazione - implementata nella v1.9.2
chiusura di FR # 2456 e Bug # 4981 .
- Gestire
factor
correttamente le colonne - implementato per la prima volta nella v1.8.10
chiusura 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.table
anche ottenuto un fill
argomento, 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:
rbindlist
ottiene un argomento use.names
, che per impostazione predefinita è FALSE
per compatibilità con le versioni precedenti.
rbindlist
ottiene anche un argomento fill
, che per impostazione predefinita è anche FALSE
per 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
rbindlist
ora possono abbinare i nomi e riempire le colonne mancanti, rbind.data.table
chiama solo rbindlist
ora. L'unica differenza è quella use.names=TRUE
di default per rbind.data.table
, per compatibilità con le versioni precedenti.
rbind.data.frame
rallenta 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.frame
potrebbe 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 rbindlist
mancanza (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 rbindlist
la use.names
funzione 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 dplyr
versione.
attr<-
,class<-
e (penso)rownames<-
tutti modificano sul posto.