2009-10-13 13 views
19

मैं डेटा फ्रेम का एक गुच्छा एक साथ मर्ज करना चाहता हूं (क्योंकि ऐसा लगता है कि यदि आप केवल डब्ल्यू/एक से निपट रहे हैं तो कई ऑपरेशन आसान हैं, लेकिन अगर मैं गलत हूं तो मुझे सही करें)।सीएसवी फाइलों से कई डेटा फ्रेम मर्ज करें

वर्तमान में मैं इस तरह एक डेटा फ्रेम है:

ID, var1, var2 
A, 2, 2 
B, 4, 5 
. 
. 
Z, 3, 2 

प्रत्येक आईडी एक ही पंक्ति w/कई एकल माप

मैं भी प्रत्येक आईडी के लिए एक csv फ़ाइल डब्ल्यू/दोहराया माप है पर है, जैसे:

फ़ाइल नाम = ID_B.csv

time, var4, var5 
0, 1, 2 
1, 4, 5 
2, 1, 6 
... 

मैं मैं चाहता हूँ क्या एस:

ID, time, va1, var2, var4, var5 
... 
B, 0, 4, 5, 1, 2, 
B, 1, 4, 5, 4, 5, 
B, 2, 4, 5, 1, 6, 
... 

मुझे वास्तव में कॉलम ऑर्डर की परवाह नहीं है। एकमात्र समाधान जिसे मैं सोच सकता हूं, प्रत्येक सीएसवी फ़ाइल में आईडी कॉलम जोड़ना है, फिर उन्हें merge() पर कॉल करके कई बार लूप करें। क्या कोई और सुरुचिपूर्ण दृष्टिकोण है?

उत्तर

15

मेरी समझ यह है कि आपको फ़ाइल नाम से आईडी निकालने की आवश्यकता है, और उसके बाद आयातित सीएसवी को मौजूदा डेटाफ्रेम के साथ मर्ज करें।

df1 <- read.csv(textConnection("ID, var1, var2 
A, 2, 2 
B, 4, 5")) 

# assuming the imported csv-files are in working directory 
filenames <- list.files(getwd(), pattern = "ID_[A-Z].csv") 

# extract ID from filename 
ids <- gsub("ID_([A-Z]).csv", "\\1", filenames) 

# import csv-files and append ID 
library(plyr) 
import <- mdply(filenames, read.csv) 
import$ID <- ids[import$Var1] 
import$Var1 <- NULL 

# merge imported csv-files and the existing dataframe 
merge(df1, import) 

परिणाम:

ID var1 var2 time var4 var5 
1 B 4 5 0 1 2 
2 B 4 5 1 4 5 
3 B 4 5 2 1 6 
+0

ओह! मुझे पूरी तरह से याद आया कि प्रत्येक सीएसवी एक आईडी के लिए माप था। रवींद्र! आपका जवाब बहुत अच्छा है। –

+6

आपको केवल 'ldply' की आवश्यकता है और' mdply' नहीं है, और आप 'नाम (फ़ाइल नाम) <- ids' करके चीजों को सरल बना सकते हैं। इसके अलावा आप 'list.files' में' getwd() 'के बजाय' .' का उपयोग करते हैं। अच्छा जवाब अन्यथा। – hadley

संबंधित मुद्दे