Comment faire pour joindre plusieurs trames de données à l'aide de dplyr?

Je veux left_join plusieurs trames de données:

dfs <- list(
  df1 = data.frame(a = 1:3, b = c("a", "b", "c")),
  df2 = data.frame(c = 4:6, b = c("a", "c", "d")),
  df3 = data.frame(d = 7:9, b = c("b", "c", "e"))
)
Reduce(left_join, dfs)
#   a b  c  d
# 1 1 a  4 NA
# 2 2 b NA  7
# 3 3 c  5  8

Cela fonctionne car ils ont tous le même b colonne, mais Reduce ne me permet pas de spécifier d'autres arguments que je peux passer à left_join. Est-il un travail autour de quelque chose comme cela?

dfs <- list(
  df1 = data.frame(a = 1:3, b = c("a", "b", "c")),
  df2 = data.frame(c = 4:6, d = c("a", "c", "d")),
  df3 = data.frame(d = 7:9, b = c("b", "c", "e"))
)

Mise à jour

Ce genre de travaux: Reduce(function(...) left_join(..., by = c("b" = "d")), dfs) mais quand by est plus qu'un élément, il donne cette erreur: Error: cannot join on columns 'b' x 'd': index out of bounds

Ne pouvez-vous pas faire Reduce(function(...) left_join(..., other args here), dfs)?
Je n'avais pas pensé à cela. Oui, je peux! N'hésitez pas à écrire comme votre réponse
Hmm, en fait, c'pauses si by a plus d'un élément. Voir mise à jour
Comment voulez-vous que la fonction de savoir qui les colonnes de jointure sur? Ce n'est pas vraiment ce que l' *_join fonctions où conçus pour faire. Si toutes les colonnes ont une commune de la colonne ID, vous pouvez utiliser ensuite votre mise à jour résout le problème. Sinon, vous allez avoir à spécifier à la main les colonnes à utiliser pour la jointure pour chaque paire.
essayez purrr:réduire() à la place?

OriginalL'auteur nachocab | 2015-12-17

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *