rbindlist
adalah versi yang dioptimalkan do.call(rbind, list(...))
, yang dikenal lambat saat digunakanrbind.data.frame
Di mana itu benar-benar unggul
Beberapa pertanyaan yang menunjukkan di mana rbindlist
bersinar
Penggabungan cepat daftar vektor data.frame demi baris
Kesulitan mengonversi daftar panjang data.frame (~ 1 juta) menjadi data.frame tunggal menggunakan do.call dan ldply
Ini memiliki tolok ukur yang menunjukkan seberapa cepat dapat.
rbind.data.frame lambat, karena suatu alasan
rbind.data.frame
tidak banyak memeriksa, dan akan cocok dengan nama. (yaitu rbind.data.frame akan menjelaskan fakta bahwa kolom mungkin dalam urutan berbeda, dan cocok dengan nama), rbindlist
tidak melakukan pemeriksaan semacam ini, dan akan bergabung dengan posisi
misalnya
do.call(rbind, list(data.frame(a = 1:2, b = 2:3), data.frame(b = 1:2, a = 2:3)))
## a b
## 1 1 2
## 2 2 3
## 3 2 1
## 4 3 2
rbindlist(list(data.frame(a = 1:5, b = 2:6), data.frame(b = 1:5, a = 2:6)))
## a b
## 1: 1 2
## 2: 2 3
## 3: 1 2
## 4: 2 3
Beberapa batasan rbindlist lainnya
Ini digunakan untuk berjuang untuk menangani factors
, karena bug yang sejak telah diperbaiki:
rbindlist dua data.tabel di mana satu memiliki faktor dan lainnya memiliki tipe karakter untuk kolom ( Bug # 2650 )
Ini memiliki masalah dengan nama kolom duplikat
lihat
Pesan peringatan: di rbindlist (allargs): NAs yang diperkenalkan oleh paksaan: kemungkinan bug di data.table? ( Bug # 2384 )
rbames rbind.data.frame bisa membuat frustasi
rbindlist
dapat menangani lists
data.frames
dan data.tables
, dan akan mengembalikan data.tabel tanpa nama pengguna
Anda dapat masuk dalam kekacauan nama pengguna menggunakan do.call(rbind, list(...))
see
Bagaimana menghindari pengubahan nama baris saat menggunakan rbind di dalam do.call?
Efisiensi memori
Dalam hal memori rbindlist
diterapkan C
, demikian juga memori efisien, digunakan setattr
untuk mengatur atribut dengan referensi
rbind.data.frame
diimplementasikan dalam R
, itu banyak penugasan, dan menggunakan attr<-
(dan class<-
dan rownames<-
semuanya akan (secara internal) membuat salinan dari data.frame yang dibuat.
attr<-
,class<-
dan (saya pikir)rownames<-
semuanya memodifikasi di tempat.DF = data.frame(a=1:3); .Internal(inspect(DF)); tracemem(DF); attr(DF,"test") <- "hello"; .Internal(inspect(DF))
.rbind.data.frame
memiliki logika "pembajakan" khusus - ketika argumen pertama adalahdata.table
, ia memanggil.rbind.data.table
, yang melakukan sedikit pemeriksaan & kemudian memanggil secararbindlist
internal. Jadi, jika Anda sudah memilikidata.table
objek untuk diikat, mungkin ada sedikit perbedaan kinerja antararbind
danrbindlist
.rbindlist
mampu mencocokkan dengan nama (use.names=TRUE
) dan juga mengisi kolom yang hilang (fill=TRUE
). Saya sudah memperbarui ini , ini dan posting ini . Apakah Anda keberatan mengedit yang ini atau tidak apa-apa jika saya melakukannya? Apa pun cara saya baik-baik saja.dplyr::rbind_list
juga sangat miripOleh
v1.9.2
,rbindlist
telah berkembang sedikit, menerapkan banyak fitur termasuk:Selain itu, di
v1.9.2
,rbind.data.table
juga memperolehfill
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: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 kolomrbind.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 daripadarbind.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
'suse.names
fitur dariv1.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
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.sumber