Oleh v1.9.2
, rbindlist
telah berkembang sedikit, menerapkan banyak fitur termasuk:
- Memilih kolom tertinggi
SEXPTYPE
sambil mengikat - diimplementasikan pada v1.9.2
penutupan FR # 2456 dan Bug # 4981 .
- Menangani
factor
kolom dengan benar - pertama kali diimplementasikan dalam v1.8.10
penutupan Bug # 2650 dan diperluas untuk mengikat faktor yang diperintahkanv1.9.2
juga, menutup FR # 4856 dan Bug # 5019 .
Selain itu, di v1.9.2
, rbind.data.table
juga memperoleh fill
argumen, yang memungkinkan untuk mengikat dengan mengisi kolom yang hilang, diimplementasikan dalam R.
Sekarang v1.9.3
, ada lebih banyak lagi perbaikan pada fitur-fitur yang ada:
rbindlist
mendapatkan argumen use.names
, yang secara default adalah FALSE
untuk kompatibilitas mundur.
rbindlist
juga mendapatkan argumen fill
, yang secara default juga FALSE
untuk kompatibilitas mundur.
- Semua fitur ini diimplementasikan dalam C, dan ditulis dengan hati-hati agar tidak berkompromi dalam kecepatan sambil menambahkan fungsionalitas.
- Karena
rbindlist
sekarang dapat mencocokkan dengan nama dan mengisi kolom yang hilang, rbind.data.table
panggil saja rbindlist
sekarang. Satu-satunya perbedaan adalah bahwa use.names=TRUE
secara default untuk rbind.data.table
, untuk kompatibilitas mundur.
rbind.data.frame
melambat sedikit karena salinan (yang menunjukkan @mnel juga) yang dapat dihindari (dengan pindah ke C). Saya pikir itu bukan satu-satunya alasan. Implementasi untuk memeriksa / mencocokkan nama kolom rbind.data.frame
juga bisa menjadi lebih lambat ketika ada banyak kolom per data.frame dan ada banyak data.frame yang akan diikat (seperti yang ditunjukkan dalam patokan di bawah).
Namun, rbindlist
kekurangan (ed) fitur tertentu (seperti tingkat faktor pemeriksaan atau nama yang cocok) memiliki bobot yang sangat kecil (atau tidak sama sekali) lebih cepat daripada rbind.data.frame
. Itu karena mereka dengan hati-hati diimplementasikan dalam C, dioptimalkan untuk kecepatan dan memori.
Berikut adalah patokan yang menyoroti efisien mengikat sembari menyamakan dengan nama kolom serta menggunakan rbindlist
's use.names
fitur dari v1.9.3
. Set data terdiri dari 10.000 data. Bingkai masing-masing ukuran 10 * 500.
NB: patokan ini telah diperbarui untuk menyertakan dibandingkan dengan 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
Mengikat kolom seperti itu tanpa memeriksa nama hanya membutuhkan 1,3, sedangkan memeriksa nama kolom dan mengikat dengan tepat hanya membutuhkan waktu 1,5 detik. Dibandingkan dengan solusi dasar, ini adalah 14x lebih cepat, dan 18x lebih cepat dari dplyr
versi.
attr<-
,class<-
dan (saya pikir)rownames<-
semuanya memodifikasi di tempat.