¿Puede dplyr unirse en varias columnas o clave compuesta?

111

Me doy cuenta de que la dplyrv3.0 te permite unirte a diferentes variables:

left_join(x, y, by = c("a" = "b")coincidirá x.acony.b

Sin embargo, ¿es posible unir una combinación de variables o tengo que agregar una clave compuesta de antemano?

Algo como esto:

left_join(x, y, by = c("a c" = "b d")para hacer coincidir la concatenación de [ x.ay x.c] con [ y.by y.d]

JasonAizkalns
fuente

Respuestas:

199

Actualización para usar tibble ()

Puede pasar un vector con nombre de longitud mayor que 1 al byargumento de left_join():

library(dplyr)

d1 <- tibble(
  x = letters[1:3],
  y = LETTERS[1:3],
  a = rnorm(3)
  )

d2 <- tibble(
  x2 = letters[3:1],
  y2 = LETTERS[3:1],
  b = rnorm(3)
  )

left_join(d1, d2, by = c("x" = "x2", "y" = "y2"))
davechilders
fuente
5
Gracias por esto; también funciona cuando las columnas de los marcos de datos tienen el mismo nombre, por ejemplo left_join(d1, d2, by = c("firstname" = "firstname", "lastname" = "lastname")). Puede que no sea obvio para algunos.
Anthony Simon Mielniczuk
10
Cuando las columnas de unión son las mismas, también puede evitar =:left_join(d1, d2, by = c("firstname", "lastname"))
davechilders
2
Ooof ... me estaba quedando en casa, pero ... esto parece ser un Y ... lo que supongo que tiene sentido, pero esperaba que fuera un x = x2 O y = y2, ya que tengo múltiples índices construido para tratar de identificar entradas duplicadas pero dañadas en recursos dispares.
Joshua Eric Turcotte
Los nombres no tienen que ser iguales, solo deben ser nombres de columna válidos en el marco de datos correspondiente, es decir, uno puede tener una columna "fname" y la otra "firstname" y funcionará bien.
San Emmanuel James