Tenho dois frames de dados que desejo unir usando dplyr. Um é um quadro de dados contendo os primeiros nomes.
test_data <- data.frame(first_name = c("john", "bill", "madison", "abby", "zzz"),
stringsAsFactors = FALSE)
O outro quadro de dados contém uma versão limpa do corpus de nomes de Kantrowitz, identificando o gênero. Aqui está um exemplo mínimo:
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"))
Eu quero essencialmente pesquisar o gênero do nome na test_data
tabela usando a kantrowitz
tabela. Como vou abstrair isso em uma função encode_gender
, não saberei o nome da coluna no conjunto de dados que será usado e, portanto, não posso garantir que será name
, como em kantrowitz$name
.
Na base, RI faria a mesclagem desta forma:
merge(test_data, kantrowitz, by.x = "first_names", by.y = "name", all.x = TRUE)
Isso retorna a saída correta:
first_name gender
1 abby either
2 bill either
3 john M
4 madison M
5 zzz <NA>
Mas eu quero fazer isso no dplyr porque estou usando esse pacote para todas as minhas outras manipulações de dados. A by
opção dplyr para as várias *_join
funções me permite especificar apenas um nome de coluna, mas preciso especificar dois. Estou procurando algo assim:
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"))
Qual é a forma de realizar esse tipo de junção usando dplyr?
(Não importa que o corpus de Kantrowitz seja uma maneira ruim de identificar o gênero. Estou trabalhando em uma implementação melhor, mas quero fazer isso funcionar primeiro.)