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.)
Jawaban:
Fitur ini telah ditambahkan di dplyr v0.3. Anda sekarang dapat meneruskan vektor karakter bernama ke
by
argumen dileft_join
(dan fungsi penggabungan lainnya) untuk menentukan kolom mana yang akan digabungkan di setiap bingkai data. Dengan contoh yang diberikan pada pertanyaan awal, kodenya adalah:left_join(test_data, kantrowitz, by = c("first_name" = "name"))
sumber
left_join(data_a, data_b, by = c("a.first" = "b.first", "a.second" = "b.second", "a.third" = "b.third"))
:?by =
opsional. Anda dapat melakukannyaleft_join(test_data, kantrowitz, c("first_name" = "name"))
Ini lebih merupakan solusi daripada solusi nyata. Anda dapat membuat objek baru
test_data
dengan nama kolom lain:left_join("names<-"(test_data, "name"), kantrowitz, by = "name") name gender 1 john M 2 bill either 3 madison M 4 abby either 5 zzz <NA>
sumber
select(test_data, first_name = name)
dan itu hanya akan membuat salinan yang dangkal.data.table::setnames
?