2010-02-05 39 views
27

मैं एक data.frame में merge कई data.frames कोशिश कर रहा हूँ के साथ एक data.frame में कई data.frames मर्ज करें। चूंकि मेरे पास फाइलों की पूरी सूची है, इसलिए मैं इसे लूप संरचना के साथ करने की कोशिश कर रहा हूं।एक पाश

अब तक पाश दृष्टिकोण ठीक काम करता है। हालांकि, यह बहुत अक्षम दिखता है और मैं सोच रहा हूं कि कोई तेज और आसान दृष्टिकोण है या नहीं।

यहां परिदृश्य है: मेरे पास .csv फ़ाइलों के साथ एक निर्देशिका है। प्रत्येक फ़ाइल में एक ही पहचानकर्ता होता है जिसे विलय चर के रूप में उपयोग किया जा सकता है। चूंकि फाइल आकार में बड़ी हैं, इसलिए मैंने एक ही समय में सभी फाइलों को पढ़ने के बजाय प्रत्येक फाइल को आर में पढ़ने के लिए सोचा था। तो मुझे list.files के साथ निर्देशिका की सभी फाइलें मिलती हैं और पहले दो फाइलों में पढ़ी जाती हैं। बाद में मैं एक data.frame प्राप्त करने के लिए merge का उपयोग करता हूं।

FileNames <- list.files(path=".../tempDataFolder/") 
FirstFile <- read.csv(file=paste(".../tempDataFolder/", FileNames[1], sep=""), 
      header=T, na.strings="NULL") 
SecondFile <- read.csv(file=paste(".../tempDataFolder/", FileNames[2], sep=""), 
       header=T, na.strings="NULL") 
dataMerge <- merge(FirstFile, SecondFile, by=c("COUNTRYNAME", "COUNTRYCODE", "Year"), 
      all=T) 

अब मैं और में एक for पाश का उपयोग सभी शेष .csv फ़ाइलें पाने के लिए उन्हें merge पहले से ही data.frame मौजूदा:

for(i in 3:length(FileNames)){ 
ReadInMerge <- read.csv(file=paste(".../tempDataFolder/", FileNames[i], sep=""), 
       header=T, na.strings="NULL") 
dataMerge <- merge(dataMerge, ReadInMerge, by=c("COUNTRYNAME", "COUNTRYCODE", "Year"), 
      all=T) 
} 

भले ही यह ठीक है, अगर वहाँ एक और अधिक मैं सोच रहा था काम करता है नौकरी पाने के लिए सुरुचिपूर्ण तरीका?

उत्तर

37

आप बारीकी से related question on stackoverflow को देखने के लिए चाहते हो सकता है।

मैं दो चरणों में इस दृष्टिकोण होगा: (plyr के साथ) सभी डेटा आयात, तो यह एक साथ मर्ज:

filenames <- list.files(path=".../tempDataFolder/", full.names=TRUE) 
library(plyr) 
import.list <- llply(filenames, read.csv) 

कि आप सभी फ़ाइलें है कि अब आप एक साथ मर्ज करने की जरूरत है की एक सूची दे देंगे । ऐसा करने के कई तरीके हैं, लेकिन यहाँ (Reduce के साथ) एक दृष्टिकोण है:

data <- Reduce(function(x, y) merge(x, y, all=T, 
    by=c("COUNTRYNAME", "COUNTRYCODE", "Year")), import.list, accumulate=F) 

वैकल्पिक रूप से, आप reshape पैकेज के साथ ऐसा कर सकते हैं अगर आप Reduce साथ सहज नहीं हैं:

library(reshape) 
data <- merge_recurse(import.list) 
+1

यह देख लायक आप पूरे वें प्राप्त कर सकते हैं कि हो सकता है: यदि मैं गलत नहीं हूँ, एक बहुत सरल परिवर्तन 3:length(FileNames) kludge को समाप्त कर सकता 'lplyply' के बजाय' ldply' को कॉल करके फ़ाइल नाम वाले अतिरिक्त '.id' कॉलम के साथ विलय कर दिया गया। 'घटाएं' या 'विलय' कॉल तब अनियंत्रित है। – CharlesB

1

FileNames <- list.files(path=".../tempDataFolder/", full.names=TRUE) 
dataMerge <- data.frame() 
for(f in FileNames){ 
    ReadInMerge <- read.csv(file=f, header=T, na.strings="NULL") 
    dataMerge <- merge(dataMerge, ReadInMerge, 
       by=c("COUNTRYNAME", "COUNTRYCODE", "Year"), all=T) 
} 
+0

@ken: चूंकि 'डेटामर्ज' खाली है 'data.frame'' मर्ज() 'फ़ंक्शन पहले' for 'लूप में एक सामान्य पहचानकर्ता नहीं ढूंढ सकता है। अगर मैं 'डेटामेज' के लिए पहली फ़ाइल असाइन करता हूं तो यह मुझे मेरे शुरुआती विचार पर वापस ले जाता है। – mropa

+0

क्षमा करें, मुझे पहले यह कोशिश करनी चाहिए थी। मैं rbind() के बारे में सोच रहा था, जिसमें एक खाली डेटा फ्रेम का इलाज किया जाता है जैसे कि आवश्यक कॉलम मौजूद हैं लेकिन खाली हैं। –