inner - left join multiple keys r
¿Cómo se especifican los nombres de las columnas para xey cuando se une a dplyr? (2)
Esta característica se ha agregado en dplyr v0.3. Ahora puede pasar un vector de caracteres con nombre al argumento by
en left_join
(y otras funciones de unión) para especificar a qué columnas se unirá en cada marco de datos. Con el ejemplo dado en la pregunta original, el código sería:
left_join(test_data, kantrowitz, by = c("first_name" = "name"))
Tengo dos marcos de datos a los que quiero unirme usando dplyr. Uno es un marco de datos que contiene los nombres.
test_data <- data.frame(first_name = c("john", "bill", "madison", "abby", "zzz"),
stringsAsFactors = FALSE)
El otro marco de datos contiene una versión limpia del corpus de nombres de Kantrowitz, que identifica el género. Aquí hay un ejemplo 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"))
Básicamente quiero buscar el género del nombre de la tabla test_data
utilizando la tabla kantrowitz
. Como voy a abstraer esto en una función encode_gender
, no sabré el nombre de la columna en el conjunto de datos que se va a utilizar, por lo que no puedo garantizar que será un name
, como en kantrowitz$name
.
En base, RI realizaría la fusión de esta manera:
merge(test_data, kantrowitz, by.x = "first_names", by.y = "name", all.x = TRUE)
Eso devuelve el resultado correcto:
first_name gender
1 abby either
2 bill either
3 john M
4 madison M
5 zzz <NA>
Pero quiero hacer esto en dplyr porque estoy usando ese paquete para todas mis otras manipulaciones de datos. El dplyr by
opción a las diversas funciones *_join
solo me permite especificar un nombre de columna, pero necesito especificar dos. Estoy buscando algo como esto:
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"))
¿Cuál es la manera de realizar este tipo de unión utilizando dplyr?
(No importa que el corpus de Kantrowitz sea una mala forma de identificar el género. Estoy trabajando en una mejor implementación, pero quiero que esto funcione primero).
Esto es más una solución alternativa que una solución real. Puede crear un nuevo objeto test_data
con otro nombre de columna:
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>