Mungkinkah untuk mengikat dua bingkai data yang tidak memiliki kumpulan kolom yang sama? Saya berharap dapat mempertahankan kolom yang tidak cocok setelah diikat.
232
rbind.fill
dari paket plyr
mungkin apa yang Anda cari.
rbind.fill
danbind_rows()
keduanya diam-diam menjatuhkan nama sandi.Solusi yang lebih baru adalah dengan menggunakan
dplyr
'sbind_rows
fungsi yang saya asumsikan lebih efisien daripadasmartbind
.sumber
ABC
tidak dapat dikonversi dari karakter ke angka. Apakah ada cara untuk mengonversi kolom terlebih dahulu?Anda dapat menggunakan
smartbind
darigtools
paket.Contoh:
sumber
smartbind
dengan dua frame data besar (total sekitar 3 * 10 ^ 6 baris) dan dibatalkan setelah 10 menit.Jika kolom dalam df1 adalah himpunan bagian dari yang ada di df2 (dengan nama kolom):
sumber
Alternatif dengan
data.table
:rbind
juga akan berfungsidata.table
selama objek dikonversi menjadidata.table
objek, jadijuga akan bekerja dalam situasi ini. Ini bisa lebih disukai ketika Anda memiliki beberapa data.tabel dan tidak ingin membangun daftar.
sumber
intersect
pendekatan, hanya berfungsi untuk 2 kerangka data dan tidak mudah digeneralisasi.Sebagian besar jawaban R dasar mengatasi situasi di mana hanya satu data.frame memiliki kolom tambahan atau bahwa data.frame yang dihasilkan akan memiliki persimpangan kolom. Karena OP menulis saya berharap untuk mempertahankan kolom yang tidak cocok setelah bind , jawaban yang menggunakan metode dasar R untuk mengatasi masalah ini mungkin patut diposkan.
Di bawah ini, saya menyajikan dua metode dasar R: Satu yang mengubah data.frame asli, dan yang tidak. Selain itu, saya menawarkan metode yang menggeneralisasi metode non-destruktif ke lebih dari dua data.frame.
Pertama, mari kita ambil beberapa sampel data.
Dua data.frame, ubah aslinya
Untuk mempertahankan semua kolom dari kedua data.frame dalam
rbind
(dan memungkinkan fungsi untuk bekerja tanpa menghasilkan kesalahan), Anda menambahkan kolom NA ke setiap data.frame dengan nama-nama yang hilang yang sesuai diisi menggunakansetdiff
.Sekarang,
rbind
-emPerhatikan bahwa dua baris pertama mengubah data.frame asli, df1 dan df2, menambahkan set kolom lengkap untuk keduanya.
Dua data.frame, jangan ubah dokumen asli
Untuk membiarkan data.frame asli tetap utuh, pertama-tama periksalah nama-nama yang berbeda, kembalikan vektor bernama NAS yang digabungkan ke dalam daftar dengan menggunakan data.frame
c
. Kemudian,data.frame
ubah hasilnya menjadi data.frame yang sesuai untukrbind
.Banyak data.frame, jangan ubah aslinya
Dalam contoh Anda memiliki lebih dari dua data.frame, Anda bisa melakukan hal berikut.
Mungkin sedikit lebih baik untuk tidak melihat nama-nama baris data.frame asli? Lalu lakukan ini.
sumber
mydflist <- list(as, dr, kr, hyt, ed1, of)
. Ini harus membangun objek daftar yang tidak menumbuhkan ukuran lingkungan Anda, tetapi hanya menunjuk ke setiap elemen daftar (selama Anda tidak mengubah konten apa pun sesudahnya). Setelah operasi, hapus daftar objek, hanya agar aman.Anda juga bisa mencabut nama kolom yang umum.
sumber
Saya menulis fungsi untuk melakukan ini karena saya suka kode saya untuk memberi tahu saya jika ada sesuatu yang salah. Fungsi ini secara eksplisit akan memberi tahu Anda nama kolom mana yang tidak cocok dan jika Anda memiliki tipe ketidakcocokan. Maka itu akan melakukan yang terbaik untuk menggabungkan data.frame. Batasannya adalah Anda hanya bisa menggabungkan dua data.frame sekaligus.
sumber
Mungkin saya benar-benar salah membaca pertanyaan Anda, tetapi "Saya berharap untuk mempertahankan kolom yang tidak cocok setelah ikatan" membuat saya berpikir Anda sedang mencari
left join
atauright join
mirip dengan permintaan SQL. R memilikimerge
fungsi yang memungkinkan Anda menentukan gabungan kiri, kanan, atau dalam mirip dengan bergabung dengan tabel di SQL.Sudah ada pertanyaan dan jawaban yang bagus tentang topik ini di sini: Bagaimana cara bergabung (menggabungkan) bingkai data (dalam, luar, kiri, kanan)?
sumber
gtools / smartbind tidak suka bekerja dengan Tanggal, mungkin karena as.vectoring. Jadi, inilah solusi saya ...
sumber
Hanya untuk dokumentasi. Anda dapat mencoba
Stack
perpustakaan dan fungsinyaStack
dalam bentuk berikut:Saya juga memiliki kesan bahwa itu lebih cepat daripada metode lain untuk set data yang besar.
sumber
Anda juga bisa menggunakan
sjmisc::add_rows()
, yang menggunakandplyr::bind_rows()
, tetapi tidak sepertibind_rows()
,add_rows()
mempertahankan atribut dan karenanya berguna untuk data berlabel .Lihat contoh berikut dengan dataset berlabel. The
frq()
-fungsi mencetak tabel frekuensi dengan label nilai, jika data yang diberi label.sumber
sumber