Saya memiliki dua bingkai data yang ingin saya gabungkan menggunakan dplyr. Salah satunya adalah bingkai data yang berisi nama depan.
test_data <- data.frame(first_name = c("john", "bill", "madison", "abby", "zzz"),
stringsAsFactors = FALSE)
Kerangka data lainnya berisi versi korpus nama Kantrowitz yang telah dibersihkan, mengidentifikasi jenis kelamin. Berikut adalah contoh minimalnya:
kantrowitz <- structure(list(name = c("john", "bill", "madison", "abby", "thomas"), gender = c("M", "either", "M", "either", "M")), .Names = c("name", "gender"), row.names = c(NA, 5L), class = c("tbl_df", "tbl", "data.frame"))
Saya pada dasarnya ingin mencari jenis kelamin nama dari test_data
tabel menggunakan kantrowitz
tabel. Karena saya akan mengabstraksi ini menjadi sebuah fungsi encode_gender
, saya tidak akan tahu nama kolom dalam kumpulan data yang akan digunakan, jadi saya tidak dapat menjamin bahwa itu akan name
, seperti pada kantrowitz$name
.
Di basis RI akan melakukan penggabungan dengan cara ini:
merge(test_data, kantrowitz, by.x = "first_names", by.y = "name", all.x = TRUE)
Itu mengembalikan keluaran yang benar:
first_name gender
1 abby either
2 bill either
3 john M
4 madison M
5 zzz <NA>
Tetapi saya ingin melakukan ini di dplyr karena saya menggunakan paket itu untuk semua manipulasi data saya yang lain. by
Opsi dplyr ke berbagai *_join
fungsi hanya memungkinkan saya menentukan satu nama kolom, tetapi saya perlu menentukan dua. Saya mencari sesuatu seperti ini:
library(dplyr)
# either
left_join(test_data, kantrowitz, by.x = "first_name", by.y = "name")
# or
left_join(test_data, kantrowitz, by = c("first_name", "name"))
Bagaimana cara melakukan jenis join ini menggunakan dplyr?
(Tidak peduli bahwa korpus Kantrowitz adalah cara yang buruk untuk mengidentifikasi gender. Saya sedang mengerjakan implementasi yang lebih baik, tapi saya ingin ini berfungsi terlebih dahulu.)