Saya memiliki 2 data.frame berikut:
a1 <- data.frame(a = 1:5, b=letters[1:5])
a2 <- data.frame(a = 1:3, b=letters[1:3])
Saya ingin mencari baris a1 yang a2 tidak.
Apakah ada fungsi bawaan untuk jenis operasi ini?
(ps: Saya memang menulis solusi untuk itu, saya hanya ingin tahu apakah seseorang telah membuat kode yang lebih baik)
Ini solusinya:
a1 <- data.frame(a = 1:5, b=letters[1:5])
a2 <- data.frame(a = 1:3, b=letters[1:3])
rows.in.a1.that.are.not.in.a2 <- function(a1,a2)
{
a1.vec <- apply(a1, 1, paste, collapse = "")
a2.vec <- apply(a2, 1, paste, collapse = "")
a1.without.a2.rows <- a1[!a1.vec %in% a2.vec,]
return(a1.without.a2.rows)
}
rows.in.a1.that.are.not.in.a2(a1,a2)
a2 <- data.frame(a = c(1:3, 1), b = c(letters[1:3], "c"))
. Biarkana1
yang sama. Sekarang coba perbandingannya. Tidak jelas bagi saya bahkan dalam membaca opsi apa cara yang tepat untuk mendaftar hanya elemen umum.SQLDF
memberikan solusi yang bagusDan baris yang ada di kedua frame data:
Versi baru
dplyr
memiliki fungsianti_join
,, untuk perbandingan semacam iniDan
semi_join
untuk menyaring barisa1
yang juga ada dia2
sumber
anti_join
dansemi_join
!Dalam dplyr :
Pada dasarnya,
setdiff(bigFrame, smallFrame)
memberi Anda catatan tambahan di tabel pertama.Dalam SQLverse ini disebut
Untuk deskripsi yang baik dari semua opsi bergabung dan menetapkan mata pelajaran, ini adalah salah satu ringkasan terbaik yang saya lihat disatukan: http://www.vertabelo.com/blog/technical-articles/sql-joins
Tetapi kembali ke pertanyaan ini - ini adalah hasil untuk
setdiff()
kode ketika menggunakan data OP:Atau bahkan Anda
anti_join(a1,a2)
akan mendapatkan hasil yang sama.Untuk info lebih lanjut: https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf
sumber
a1
yang tidak ada dia2
dalamnya, bukankah Anda ingin menggunakan sesuatu sepertisemi_join(a1, a2, by = c('a','b'))
? Dalam jawaban oleh "Rickard", saya melihatsemi_join
itu disarankan.setdiff()
fungsi dasar yang bekerja pada dua vektor: stat.ethz.ch/R-manual/R-devel/library/base/html/sets.html . Mungkin Anda telah memuat pustaka lubridate setelah dplyr dan disarankan sebagai sumber dalam daftar tabcomplete?Ini tentu saja tidak efisien untuk tujuan khusus ini, tetapi yang sering saya lakukan dalam situasi ini adalah memasukkan variabel indikator di setiap data.frame dan kemudian menggabungkan:
nilai-nilai yang hilang di Included_a1 akan mencatat baris mana yang hilang dalam a1. sama untuk a2.
Satu masalah dengan solusi Anda adalah bahwa pesanan kolom harus cocok. Masalah lain adalah mudah untuk membayangkan situasi di mana baris dikodekan sebagai sama padahal sebenarnya berbeda. Keuntungan menggunakan penggabungan adalah Anda mendapatkan secara gratis semua pengecekan kesalahan yang diperlukan untuk solusi yang baik.
sumber
included_a1
? : - /Saya menulis sebuah paket ( https://github.com/alexsanjoseph/compareDF ) karena saya memiliki masalah yang sama.
Contoh yang lebih rumit:
Paket ini juga memiliki perintah html_output untuk pemeriksaan cepat
sumber
The two data frames have different columns!
Anda bisa menggunakan
daff
paket (yang membungkusdaff.js
perpustakaan menggunakanV8
paket ):menghasilkan objek perbedaan berikut:
Format diff dijelaskan dalam format diff Highlighter Coopy untuk tabel dan harus cukup jelas. Baris-baris dengan
+++
pada kolom pertama@@
adalah yang baru masuka1
dan tidak ada dalama2
.Objek perbedaan dapat digunakan untuk
patch_data()
, menyimpan perbedaan untuk tujuan dokumentasi menggunakanwrite_diff()
atau untuk memvisualisasikan perbedaan menggunakanrender_diff()
:menghasilkan output HTML yang rapi:
sumber
Menggunakan
diffobj
paket:sumber
Saya mengadaptasi
merge
fungsi untuk mendapatkan fungsi ini. Pada kerangka data yang lebih besar itu menggunakan lebih sedikit memori daripada solusi penggabungan penuh. Dan saya bisa bermain dengan nama-nama kolom kunci.Solusi lain adalah dengan menggunakan perpustakaan
prob
.sumber
Contoh data Anda tidak memiliki duplikat, tetapi solusi Anda menanganinya secara otomatis. Ini berarti bahwa beberapa jawaban yang berpotensi tidak akan cocok dengan hasil fungsi Anda jika ada duplikat.
Ini solusi saya yang alamatnya sama dengan milik Anda. Ini juga berskala besar!
Perlu data.tabel 1.9.8+
sumber
Mungkin terlalu sederhana, tetapi saya menggunakan solusi ini dan saya merasa sangat berguna ketika saya memiliki kunci utama yang dapat saya gunakan untuk membandingkan set data. Semoga bisa membantu.
sumber
Namun solusi lain berdasarkan match_df di plyr. Inilah match_df plyr:
Kita dapat memodifikasinya untuk meniadakan:
Kemudian:
sumber
Menggunakan
subset
:sumber
Kode berikut menggunakan keduanya
data.table
danfastmatch
untuk meningkatkan kecepatan.sumber