O dplyr pode se unir em várias colunas ou chave composta?

111

Sei que a dplyrv3.0 permite que você junte variáveis ​​diferentes:

left_join(x, y, by = c("a" = "b")vai combinar x.acomy.b

No entanto, é possível juntar em uma combinação de variáveis ​​ou eu tenho que adicionar uma chave composta antes?

Algo assim:

left_join(x, y, by = c("a c" = "b d")para combinar a concatenação de [ x.ae x.c] para [ y.be y.d]

JasonAizkalns
fonte

Respostas:

199

Atualizando para usar tibble ()

Você pode passar um vetor nomeado de comprimento maior que 1 para o 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
fonte
5
Obrigado por isso; também funciona quando as colunas nos quadros de dados têm o mesmo nome, por exemplo left_join(d1, d2, by = c("firstname" = "firstname", "lastname" = "lastname")). Pode não ser óbvio para alguns.
Anthony Simon Mielniczuk
10
Quando as colunas de junção são iguais, você também pode evitar =:left_join(d1, d2, by = c("firstname", "lastname"))
davechilders
2
Uau ... Eu estava esperando em casa, mas ... isso parece ser um AND ... o que eu acho que faz sentido, mas esperava que fosse um x = x2 OR y = y2, pois tenho vários índices construído para tentar identificar entradas duplicadas, mas danificadas em recursos diferentes.
Joshua Eric Turcotte
Os nomes não precisam ser iguais, devem ser apenas nomes de coluna válidos no dataframe correspondente, ou seja, um pode ter uma coluna "fname" e o outro "firstname" e funcionará perfeitamente.
San Emmanuel James