Dplyr peut-il se joindre sur plusieurs colonnes ou clé composite?

111

Je me rends compte que la dplyrv3.0 vous permet de rejoindre sur différentes variables:

left_join(x, y, by = c("a" = "b")correspondra x.aày.b

Cependant, est-il possible de joindre sur une combinaison de variables ou dois-je ajouter une clé composite au préalable?

Quelque chose comme ça:

left_join(x, y, by = c("a c" = "b d")pour faire correspondre la concaténation de [ x.aet x.c] à [ y.bet y.d]

JasonAizkalns
la source

Réponses:

200

Mise à jour pour utiliser tibble ()

Vous pouvez passer un vecteur nommé de longueur supérieure à 1 à l' byargument 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
la source
5
Merci pour cela; fonctionne également lorsque les colonnes des blocs de données ont le même nom, par exemple left_join(d1, d2, by = c("firstname" = "firstname", "lastname" = "lastname")). Peut-être pas évident pour certains.
Anthony Simon Mielniczuk
10
Lorsque les colonnes de jointure sont les mêmes, vous pouvez également éviter =:left_join(d1, d2, by = c("firstname", "lastname"))
davechilders
2
Ooof ... je tenais la maison, mais ... cela semble être un ET ... ce qui, je suppose, a du sens, mais j'espérais que ce serait un x = x2 OU y = y2, car j'ai plusieurs index conçu pour essayer d'identifier les entrées dupliquées mais endommagées sur des ressources disparates.
Joshua Eric Turcotte
Les noms ne doivent pas nécessairement être les mêmes, ils doivent simplement être des noms de colonne valides dans le dataframe correspondant, c'est-à-dire que l'un peut avoir une colonne "fname" et l'autre "firstname" et fonctionnera très bien.
San Emmanuel James