Durch v1.9.2
, rbindlist
hatte ziemlich viel entwickelt, Implementierung viele Funktionen , einschließlich:
- Auswählen der höchsten
SEXPTYPE
Spalte während der Bindung - implementiert beim v1.9.2
Schließen von FR # 2456 und Bug # 4981 .
- Ordnungsgemäßer Umgang mit
factor
Spalten - zuerst beim v1.8.10
Schließen von Bug # 2650 implementiert und erweitert, um auch geordnete Faktoren sorgfältig zu binden v1.9.2
, wobei FR # 4856 und Bug # 5019 geschlossen werden .
Darüber hinaus in v1.9.2
, rbind.data.table
gewinnt auch ein fill
Argument, dass durch das Ausfüllen fehlende Spalt zu binden kann, implementiert in R.
Jetzt v1.9.3
gibt es noch weitere Verbesserungen an diesen vorhandenen Funktionen:
rbindlist
erhält ein Argument use.names
, das standardmäßig der FALSE
Abwärtskompatibilität dient.
rbindlist
erhält auch ein Argument fill
, das standardmäßig auch der FALSE
Abwärtskompatibilität dient.
- Diese Funktionen sind alle in C implementiert und sorgfältig geschrieben, um beim Hinzufügen von Funktionen keine Kompromisse bei der Geschwindigkeit einzugehen.
- Da
rbindlist
jetzt nach Namen übereinstimmen und fehlende Spalten füllen können, rbind.data.table
ruft rbindlist
jetzt einfach auf . Der einzige Unterschied besteht darin, dass aus Gründen der Abwärtskompatibilität use.names=TRUE
standardmäßig rbind.data.table
.
rbind.data.frame
verlangsamt sich ziemlich stark, hauptsächlich aufgrund von Kopien (auf die @mnel ebenfalls hinweist), die vermieden werden könnten (indem man zu C wechselt). Ich denke, das ist nicht der einzige Grund. Die Implementierung zum Einchecken / Abgleichen von Spaltennamen in rbind.data.frame
kann auch langsamer werden, wenn viele Spalten pro data.frame vorhanden sind und viele solcher data.frames gebunden werden müssen (wie im folgenden Benchmark gezeigt).
Das rbindlist
Fehlen (ed) bestimmter Funktionen (wie das Überprüfen von Faktorstufen oder übereinstimmenden Namen) hat jedoch ein sehr geringes (oder gar kein) Gewicht dafür, dass es schneller als ist rbind.data.frame
. Dies liegt daran, dass sie sorgfältig in C implementiert und auf Geschwindigkeit und Speicher optimiert wurden.
Hier ist ein Maßstab, unterstreicht die effiziente Bindung , während sie durch die Spaltennamen passend als auch unter Verwendung von rbindlist
‚s - use.names
Funktion aus v1.9.3
. Der Datensatz besteht aus 10000 Datenrahmen mit einer Größe von jeweils 10 * 500.
NB: Dieser Benchmark wurde aktualisiert und enthält nun einen Vergleich mit 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
Das Binden von Spalten als solche ohne Überprüfung auf Namen dauerte nur 1,3, während das Überprüfen auf Spaltennamen und das entsprechende Binden nur 1,5 Sekunden länger dauerte. Im Vergleich zur Basislösung ist dies 14x schneller und 18x schneller als dplyr
die Version.
attr<-
,class<-
und (glaube ich)rownames<-
alle ändern sich an Ort und Stelle.