2015-01-31 11 views
12

In R, wie kann ich inner_join multiple tbls oder data.frame s effektiv?wie zu dplyr :: inner_join multi tbls oder data.frames in R

Zum Beispiel:

devtools::install_github("rstudio/EDAWR") 
library(EDAWR) 
library(dplyr) 
data(songs) 
data(artists) 
test <- songs 
colnames(test) <- c("song2", "name") 
inner_join(songs, artists,by="name") %>% inner_join(test,by="name") 

Es gibt Hunderte test -ähnlichen data.frames, dass ich teilnehmen möchten.

Antwort

19

Sie könnten den Datenrahmen in einer Liste sammeln und Reduce verwenden:

L <- list(songs, artists, test) 
Reduce(inner_join, L) 

# name plays    song    song2 
# 1 John guitar Across the Universe Across the Universe 
# 2 John guitar  Come Together Across the Universe 
# 3 John guitar Across the Universe  Come Together 
# 4 John guitar  Come Together  Come Together 
# 5 Paul bass  Hello, Goodbye  Hello, Goodbye 

Sie L <- mget(ls()) (mit einer optionalen pattern ARG ls) verwenden kann, alles in eine Liste zu bekommen.


Wie @akrun in den Kommentaren erwähnt, eine plyr Alternative ist:

library(plyr) 
join_all(L, type='inner') 
+0

Es gibt einen Unterschied zwischen 'Reduce' und' plyr :: join_all' aus dem Handbuch. Der Para, 'by'. Dies funktioniert, wenn die 'colnames (test)' die gleichen wie Datensongs sind. (NICHT TEST!). In der 'Reduce'-Situation werden alle gleichen Spaltennamen verwendet. –

+1

Dies ist ein sehr netter Ansatz. Ich frage mich, ob Sie in 'Reduce()' '' by' Argument '' Join' hinzufügen können. – jazzurro

+1

@jazzurro Nun, du kannst 'Reduce (Funktion (x, y) inner_join (x, y, durch = c ('foo' = 'bar')), L)', aber ich denke, das würde das 'von' erfordern Spalte für Element 1 ist 'foo' und für alle nachfolgenden Elemente ist es 'bar'. – jbaums