Saya memiliki daftar banyak data.frame yang ingin saya gabungkan. Masalahnya di sini adalah bahwa setiap data.frame berbeda dalam hal jumlah baris dan kolom, tetapi mereka semua berbagi variabel kunci (yang saya panggil "var1"
dan "var2"
dalam kode di bawah). Jika data.frame identik dalam hal kolom, saya hanya bisa rbind
, untuk yang plyr's rbind.fill akan melakukan pekerjaan, tetapi itu tidak terjadi dengan data ini.
Karena merge
perintah hanya berfungsi pada 2 frame data, saya beralih ke Internet untuk mencari ide. Saya mendapatkan yang ini dari sini , yang bekerja dengan sempurna di R 2.7.2, yang merupakan apa yang saya miliki saat itu:
merge.rec <- function(.list, ...){
if(length(.list)==1) return(.list[[1]])
Recall(c(list(merge(.list[[1]], .list[[2]], ...)), .list[-(1:2)]), ...)
}
Dan saya akan memanggil fungsi seperti ini:
df <- merge.rec(my.list, by.x = c("var1", "var2"),
by.y = c("var1", "var2"), all = T, suffixes=c("", ""))
Tetapi dalam versi R apa pun setelah 2.7.2, termasuk 2.11 dan 2.12, kode ini gagal dengan kesalahan berikut:
Error in match.names(clabs, names(xi)) :
names do not match previous names
(Kebetulan, saya melihat referensi lain untuk kesalahan ini di tempat lain tanpa resolusi).
Apakah ada cara untuk menyelesaikan ini?
map_dfr()
ataumap_dfc()
dfs = [df1, df2, df3]
lalureduce(pandas.merge, dfs)
.Mengurangi membuatnya cukup mudah:
Berikut adalah contoh lengkap menggunakan beberapa data tiruan:
Dan inilah contoh menggunakan data ini untuk mereplikasi
my.list
:Catatan: Sepertinya ini adalah bug di
merge
. Masalahnya adalah tidak ada pemeriksaan yang menambahkan sufiks (untuk menangani nama yang tidak cocok yang tumpang tindih) benar-benar membuatnya menjadi unik. Pada titik tertentu yang digunakannya[.data.frame
yang melakukanmake.unique
nama, menyebabkanrbind
gagal.Cara termudah untuk memperbaikinya adalah dengan tidak meninggalkan bidang yang berganti nama menjadi duplikat bidang (yang ada banyak di sini) hingga
merge
. Misalnya:The
merge
/Reduce
kemudian akan bekerja dengan baik.sumber
empty <- data.frame(x=numeric(0),a=numeric(0); L3 <- c(empty,empty,list.of.data.frames,empty,empty,empty)
dan mendapatkan beberapa hal aneh yang belum saya ketahui.Anda dapat melakukannya dengan menggunakan
merge_all
dalamreshape
paket. Anda dapat melewatkan parameter untukmerge
menggunakan...
argumenBerikut adalah sumber yang bagus untuk berbagai metode untuk menggabungkan bingkai data .
sumber
Anda dapat menggunakan rekursi untuk melakukan ini. Saya belum memverifikasi yang berikut, tetapi seharusnya memberi Anda ide yang tepat:
sumber
Saya akan menggunakan kembali contoh data dari @PaulRougieux
Inilah solusi singkat dan manis menggunakan
purrr
dantidyr
sumber
Fungsi
eat
paket saya safejoin memiliki fitur seperti itu, jika Anda memberikannya daftar data.frame sebagai input kedua, ia akan bergabung secara rekursif ke input pertama.Meminjam dan memperluas data jawaban yang diterima:
Kami tidak harus mengambil semua kolom, kami dapat menggunakan pembantu terpilih dari tidyselect dan pilih (saat kami mulai dari
.x
semua.x
kolom disimpan):atau hapus yang spesifik:
Jika daftar ini dinamai, nama akan digunakan sebagai awalan:
Jika ada konflik kolom,
.conflict
argumen ini memungkinkan Anda untuk menyelesaikannya, misalnya dengan mengambil yang pertama / kedua, menambahkannya, menyatukannya, atau menumpuknya.pertahankan dulu:
tetap bertahan:
Menambahkan:
bersatu:
sarang:
NA
nilai bisa diganti dengan menggunakan.fill
argumen.Secara default itu disempurnakan
left_join
tapi semua dplyr bergabung didukung melalui.mode
argumen, kabur bergabung juga didukung melaluimatch_fun
argumen (itu melilit paketfuzzyjoin
) atau memberikan susu formula seperti~ X("var1") > Y("var2") & X("var3") < Y("var4")
padaby
argumen.sumber
Saya punya daftar dataframe tanpa kolom id umum.
Saya memiliki data yang hilang pada banyak dfs. Ada nilai Null. Dataframe diproduksi menggunakan fungsi tabel. Reduce, Merging, rbind, rbind.fill, dan sejenisnya tidak dapat membantu saya untuk tujuan saya. Tujuan saya adalah untuk menghasilkan kerangka data gabungan yang dapat dimengerti, tidak relevan dengan data yang hilang dan kolom id umum.
Karena itu, saya membuat fungsi berikut. Mungkin fungsi ini bisa membantu seseorang.
itu mengikuti fungsi
Menjalankan contoh
sumber
Ketika Anda memiliki daftar dfs, dan sebuah kolom berisi "ID", tetapi dalam beberapa daftar, beberapa ID hilang, maka Anda dapat menggunakan versi Reduce / Gabung ini untuk bergabung dengan beberapa Df dari Id Baris atau label yang hilang:
sumber
Berikut ini adalah pembungkus generik yang dapat digunakan untuk mengubah fungsi biner menjadi fungsi multi-parameter. Manfaat dari solusi ini adalah sangat generik dan dapat diterapkan ke fungsi biner apa pun. Anda hanya perlu melakukannya sekali dan kemudian Anda bisa menerapkannya di mana saja.
Untuk demo ide, saya menggunakan rekursi sederhana untuk diterapkan. Tentu saja dapat diimplementasikan dengan cara yang lebih elegan yang mendapat manfaat dari dukungan R yang baik untuk paradigma fungsional.
Kemudian Anda bisa membungkus fungsi biner dengan itu dan memanggil dengan parameter posisi (biasanya data.frame) dalam tanda kurung pertama dan parameter bernama dalam tanda kurung kedua (seperti
by =
atausuffix =
). Jika tidak ada parameter bernama, biarkan tanda kurung kedua kosong.sumber