Saya memiliki kode yang di satu tempat berakhir dengan daftar bingkai data yang saya benar-benar ingin konversi menjadi satu bingkai data besar.
Saya mendapat beberapa petunjuk dari pertanyaan sebelumnya yang mencoba melakukan sesuatu yang serupa tetapi lebih kompleks.
Berikut adalah contoh dari apa yang saya mulai dengan (ini sangat disederhanakan untuk ilustrasi):
listOfDataFrames <- vector(mode = "list", length = 100)
for (i in 1:100) {
listOfDataFrames[[i]] <- data.frame(a=sample(letters, 500, rep=T),
b=rnorm(500), c=rnorm(500))
}
Saya sedang menggunakan ini:
df <- do.call("rbind", listOfDataFrames)
do.call("rbind", list)
idiom adalah apa yang telah saya gunakan sebelumnya juga. Mengapa Anda membutuhkan inisialunlist
?Jawaban:
Gunakan bind_rows () dari paket dplyr:
sumber
.id = "column_label"
menambahkan nama baris unik berdasarkan nama elemen daftar.dplyr
merupakan alat yang cepat dan kuat untuk digunakan, saya telah mengubah ini menjadi jawaban yang diterima. Tahun-tahun berlalu, mereka terbang!Satu opsi lain adalah menggunakan fungsi plyr:
Ini sedikit lebih lambat dari aslinya:
Dugaan saya adalah bahwa menggunakan
do.call("rbind", ...)
akan menjadi pendekatan tercepat yang akan Anda temukan kecuali Anda dapat melakukan sesuatu seperti (a) menggunakan matriks, bukan data.frame dan (b) mengalokasikan awal matriks akhir dan menetapkannya daripada menumbuhkannya .Edit 1 :
Berdasarkan komentar Hadley, inilah versi terbaru
rbind.fill
dari CRAN:Ini lebih mudah daripada rbind, dan sedikit lebih cepat (timing ini bertahan lebih dari beberapa kali). Dan sejauh yang saya mengerti, versi
plyr
on github bahkan lebih cepat dari ini.sumber
I()
dapat menggantikan panggilandata.frame
Andaldply
melt.list
membentuk kembali (2)do.call(function(...) rbind(..., make.row.names=F), df)
berguna jika Anda tidak ingin nama unik unik yang dihasilkan secara otomatis.Untuk tujuan kelengkapan, saya pikir jawaban untuk pertanyaan ini memerlukan pembaruan. "Dugaan saya adalah bahwa menggunakan
do.call("rbind", ...)
akan menjadi pendekatan tercepat yang akan Anda temukan ..." Itu mungkin benar untuk Mei 2010 dan beberapa waktu setelahnya, tetapi pada sekitar Sep 2011 fungsi barurbindlist
diperkenalkan dalamdata.table
paket versi 1.8.2 , dengan komentar bahwa "Ini melakukan hal yang samado.call("rbind",l)
, tetapi jauh lebih cepat". Seberapa cepat?sumber
ldply
sekelompok frame data yang panjang dan cair. Bagaimanapun, saya mendapat speedup yang luar biasa dengan menggunakanrbindlist
saran Anda .dplyr::rbind_all(listOfDataFrames)
akan melakukan trik juga.rbindlist
tetapi yang menambahkan frame data dengan kolom? sesuatu seperti cbindlist?do.call()
sudah berjalan di daftar bingkai data selama 18 jam, dan masih belum selesai, terima kasih !!!Kode:
Sidang:
UPDATE : Jalankan kembali 31-Jan-2018. Berlari di komputer yang sama. Versi paket baru. Menambahkan benih untuk pecinta benih.
UPDATE : Jalankan kembali 06-Agustus-2019.
sumber
set.seed
) tetapi melihat beberapa perbedaan dalam kinerja kasus terburuk.rbindlist
benar-benar memiliki kasus terburuk terbaik serta kasus khas terbaik dalam hasil sayaAda juga
bind_rows(x, ...)
didplyr
.sumber
Inilah cara lain yang dapat dilakukan (hanya menambahkannya ke jawaban karena
reduce
merupakan alat fungsional yang sangat efektif yang sering diabaikan sebagai pengganti loop. Dalam kasus khusus ini, tak satu pun dari ini secara signifikan lebih cepat daripada do.call)menggunakan basis R:
atau, menggunakan tidyverse:
sumber
Bagaimana seharusnya dilakukan di rapi:
sumber
map
jikabind_rows
bisa mengambil daftar dataframe?Visual yang diperbarui untuk mereka yang ingin membandingkan beberapa jawaban terakhir (saya ingin membandingkan solusi purrr dengan dplyr). Pada dasarnya saya menggabungkan jawaban dari @TheVTM dan @rmf.
Kode:
Info Sesi:
Versi Paket:
sumber
Satu-satunya hal yang
data.table
hilang dengan solusi adalah kolom pengidentifikasi untuk mengetahui dari mana dataframe dalam daftar data berasal.Sesuatu seperti ini:
The
idcol
parameter menambahkan kolom (.id
) mengidentifikasi asal dataframe yang terkandung dalam daftar. Hasilnya akan terlihat seperti ini:sumber