Kann dplyr mehrere Spalten oder zusammengesetzte Schlüssel verbinden?

111

Mir ist klar, dplyrdass Sie mit Version 3.0 verschiedene Variablen verknüpfen können:

left_join(x, y, by = c("a" = "b")passt auf x.azuy.b

Ist es jedoch möglich, eine Kombination von Variablen zu verknüpfen, oder muss ich vorher einen zusammengesetzten Schlüssel hinzufügen?

Etwas wie das:

left_join(x, y, by = c("a c" = "b d")um die Verkettung von [ x.aund x.c] mit [ y.bund y.d] abzugleichen

JasonAizkalns
quelle

Antworten:

199

Aktualisierung auf tibble ()

Sie können einen benannten Vektor mit einer Länge von mehr als 1 an das byArgument übergeben 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"))
Davechilder
quelle
5
Danke dafür; funktioniert auch, wenn die Spalten in den Datenrahmen den gleichen Namen haben, z left_join(d1, d2, by = c("firstname" = "firstname", "lastname" = "lastname")). Für manche vielleicht nicht offensichtlich.
Anthony Simon Mielniczuk
10
Wenn die Join-Spalten identisch sind, können Sie auch die folgenden vermeiden =:left_join(d1, d2, by = c("firstname", "lastname"))
Davechilders
2
Ooof ... Ich habe mich zu Hause aufgehalten, aber ... das scheint ein UND zu sein ... was ich für sinnvoll halte, aber ich hatte gehofft, es wäre ein x = x2 ODER y = y2, da ich mehrere Indizes habe Entwickelt, um zu versuchen, doppelte, aber beschädigte Einträge über unterschiedliche Ressourcen hinweg zu identifizieren.
Joshua Eric Turcotte
Die Namen müssen nicht identisch sein, sie sollten nur gültige Spaltennamen im entsprechenden Datenrahmen sein, dh einer kann eine Spalte "fname" und der andere "Vorname" haben und funktioniert einwandfrei.
San Emmanuel James