Ho due frame di dati che voglio unire usando dplyr. Uno è un frame di dati contenente i nomi.
test_data <- data.frame(first_name = c("john", "bill", "madison", "abby", "zzz"),
stringsAsFactors = FALSE)
L'altro data frame contiene una versione pulita del corpus dei nomi Kantrowitz, che identifica il sesso. Ecco un esempio minimo:
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"))
In sostanza voglio cercare il sesso del nome dalla test_data
tabella utilizzando la kantrowitz
tabella. Poiché lo astraggerò in una funzione encode_gender
, non conoscerò il nome della colonna nel set di dati che verrà utilizzato, quindi non posso garantire che lo sarà name
, come in kantrowitz$name
.
In base RI eseguirà l'unione in questo modo:
merge(test_data, kantrowitz, by.x = "first_names", by.y = "name", all.x = TRUE)
Ciò restituisce l'output corretto:
first_name gender
1 abby either
2 bill either
3 john M
4 madison M
5 zzz <NA>
Ma voglio farlo in dplyr perché sto usando quel pacchetto per tutte le mie altre manipolazioni dei dati. L' by
opzione dplyr per le varie *_join
funzioni mi consente di specificare solo un nome di colonna, ma devo specificarne due. Sto cercando qualcosa del genere:
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 è il modo per eseguire questo tipo di join utilizzando dplyr?
(Non importa che il corpus di Kantrowitz sia un cattivo modo per identificare il genere. Sto lavorando a un'implementazione migliore, ma prima voglio che funzioni.)