У мене є два кадри даних, до яких я хочу приєднатися за допомогою dplyr. Один - це кадр даних, що містить імена.
test_data <- data.frame(first_name = c("john", "bill", "madison", "abby", "zzz"),
stringsAsFactors = FALSE)
Інший фрейм даних містить очищену версію корпусу імен Кантровіца, що визначає стать. Ось мінімальний приклад:
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"))
По суті, я хочу шукати стать назви з test_data
таблиці за допомогою kantrowitz
таблиці. Оскільки я збираюся абстрагувати це до функції encode_gender
, я не буду знати назви стовпця в наборі даних, який буде використовуватися, і тому я не можу гарантувати, що це буде name
, як у kantrowitz$name
.
У базовій RI буде виконувати злиття таким чином:
merge(test_data, kantrowitz, by.x = "first_names", by.y = "name", all.x = TRUE)
Це повертає правильний результат:
first_name gender
1 abby either
2 bill either
3 john M
4 madison M
5 zzz <NA>
Але я хочу зробити це в dplyr, оскільки я використовую цей пакет для всіх інших маніпуляцій з даними. Параметр dplyr by
для різних *_join
функцій дозволяє мені вказати лише одне ім'я стовпця, але мені потрібно вказати два. Я шукаю щось подібне:
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"))
Який спосіб виконати такий вид об’єднання за допомогою dplyr?
(Неважливо, що корпус Кантровіца - це поганий спосіб визначити стать. Я працюю над кращим впровадженням, але я хочу, щоб це працювало першим.)