2015-01-31 23 views
12

W R, jak mogę inner_join wiele lub data.frame s skutecznie?jak dplyr :: inner_join multi tbls lub data.frames w R

Na przykład:

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

Istnieją setki test -jak data.frames że chcę dołączyć.

Odpowiedz

19

Można by zbierać ramek danych na liście i użyć Reduce:

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 

Można użyć L <- mget(ls()) (z opcjonalnym pattern arg ls), aby wszystko w liście.


Jak @akrun wymienionego w komentarzach, o plyr alternatywą jest:

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

Jest różnica pomiędzy 'Reduce' i' plyr :: join_all' z podręcznika. Para, "przez". Działa to, gdy 'colnames (test)' jest taki sam jak utwory danych. (NIE TEST!). W sytuacji 'Reduce' użyje wszystkich tych samych nazw do przyłączenia się. –

+1

To bardzo miłe podejście. Zastanawiam się, czy możesz dodać argument "by" z 'join' w' Reduce() '. – jazzurro

+1

@jazzurro Cóż, możesz 'Zmniejszyć (function (x, y) inner_join (x, y, przez = c ('foo' = 'bar')), L)', ale myślę, że to wymagałoby by 'by' kolumna dla elementu 1 to 'foo', a dla wszystkich kolejnych elementów jest to' bar'. – jbaums

Powiązane problemy