Подтвердить что ты не робот

Как указать имена столбцов для x и y при объединении в dplyr?

У меня есть два кадра данных, которые я хочу объединить, используя 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.

В базе R я бы выполнил слияние таким образом:

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?

(Неважно, что корпус Кантровица - плохой способ определить пол. Я работаю над лучшей реализацией, но я хочу, чтобы эта работа была первой.)

4b9b3361

Ответ 1

Эта функция была добавлена ​​в dplyr v0.3. Теперь вы можете передать именованный символ символа в аргумент by в left_join (и другие функции присоединения), чтобы указать, какие столбцы должны объединяться в каждом кадре данных. В примере, указанном в исходном вопросе, код будет выглядеть следующим образом:

left_join(test_data, kantrowitz, by = c("first_name" = "name"))

Ответ 2

Это скорее обходное решение, чем реальное решение. Вы можете создать новый объект test_data с другим именем столбца:

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>