2015-01-31 10 views
12

में आर, मैं inner_join एकाधिक tbls या data.frame एस प्रभावी ढंग से कैसे कर सकता हूं?कैसे dplyr :: आंतरिक_join बहु tbls या डेटा.फ्रेम 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 तरह 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' बीच एक अंतर है। पैरा, 'द्वारा'। यह तब काम करता है जब 'उपनाम (परीक्षण)' डेटा गानों के समान होता है। (टेस्ट नहीं!)। 'कम करें' स्थिति में, यह सभी समान नामों का उपयोग करने के लिए उपयोग करेगा। –

+1

यह एक बहुत अच्छा तरीका है। मुझे आश्चर्य है कि क्या आप 'घटाएं') में 'join'' के तर्क से 'जोड़' जोड़ सकते हैं। – jazzurro

+1

@jazzurro ठीक है आप 'घटा सकते हैं (फ़ंक्शन (एक्स, वाई) inner_join (x, y, by = c (' foo '=' bar ')), एल)', लेकिन मुझे लगता है कि 'by' तत्व 1 के लिए कॉलम 'foo' है, और बाद के सभी तत्वों के लिए यह' bar' है। – jbaums