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]

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"))

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.