2015-01-31 2 views
12

R에서 어떻게 inner_jointbls 또는 data.frame 여러 가지 효과적으로 할 수 있습니까? 예를 들어어떻게 dplyr :: inner_join 멀티 블록 또는 데이터 프레임에서 R

:

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

수백 내가 가입하려는 test -like data.frames있다.

답변

19

당신은 목록에서 데이터 프레임을 수집하고 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 

당신은 목록에 모든 것을 얻을 수 (ls에 옵션 pattern 인수로) L <- mget(ls())를 사용할 수 있습니다.


은 코멘트에서 언급 @akrun 같이, plyr 대안은 다음과 같습니다

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

매뉴얼에서'Reduce'와'plyr :: join_all' 사이에 차이가 있습니다. 파라, 'by'. 이것은'colnames (test)'가 데이터 노래와 같을 때 작동합니다. (시험하지 마라!). 'Reduce' 상황에서는 모든 동일한 colnames를 사용하여 결합합니다. –

+1

아주 좋은 접근 방법입니다. Reduce()에서'join '의'by by'인수를 추가 할 수 있을지 궁금합니다. – jazzurro

+1

@jazzurro 그럼'Reduce (function (x, y) inner_join (x, y, by = c ('foo'= 'bar')), L)'하지만,'by' 요소 1의 열은'foo'이며 모든 후속 요소의 열은'bar'입니다. – jbaums

관련 문제