2011-03-05 19 views
5

से आर में एक नया डेटा फ्रेम बनाना यह वास्तव में एक साधारण समस्या है, लेकिन मैं यह समझ नहीं सकता कि इसे कैसे स्क्रिप्ट करना है। जब तक मैं इसे समझ नहीं पाता तब तक मैं आगे नहीं बढ़ सकता। मैं आर के लिए वास्तव में नया हूं और कोड का उपयोग करने के लिए, और मैं कई प्रारंभिक मैनुअल के माध्यम से जा रहा हूं, लेकिन अभी तक इस विशिष्ट समस्या के लिए कुछ भी नहीं मिला है।एक exisiting, अपर्याप्त डेटा फ्रेम

आम तौर पर, यह मुद्दा है।

a <- c(1995,1995,1995,1996,1997,1997,1997,1998) 
b <- c(1,2,3,1,2,3,4,1) 
c <- c(5,7,8,2,4,5,7,8) 
(x <- data.frame(a,b,c)) 
    a b c 
1 1995 1 5 
2 1995 2 7 
3 1995 3 9 
4 1996 1 2 
5 1997 2 4 
6 1997 3 5 
7 1997 4 7 
8 1998 1 8 

स्तंभ a में वर्षों से कुछ के लिए एक से अधिक प्रविष्टियां (यानी 1995 प्रकट होता है 3 बार) कर रहे हैं, जब वास्तव में मैं सिर्फ प्रत्येक वर्ष के लिए एक प्रविष्टि हैं: मान लीजिए कि मैं x नामक एक डेटा फ्रेम ऐसा दिखता है जैसे करते हैं । यदि मैं कॉलम c के विरुद्ध कॉलम a प्लॉट करने का प्रयास करता हूं, तो मैं प्रत्येक दिनांक के लिए कई बिंदुओं के साथ समाप्त हो जाऊंगा, लेकिन यह सहायक नहीं है। मुझे कॉलम बी के बारे में परवाह नहीं है, लेकिन मैं प्रत्येक वर्ष के लिए कॉलम c के लिए प्रविष्टियों को जोड़ना चाहता हूं, जैसे कि मैं प्रत्येक वर्ष के लिए एक प्रविष्टि के साथ डेटा फ्रेम के साथ समाप्त होता हूं। उपर्युक्त डेटा को देखते हुए, परिणामी डेटा फ्रेम इस तरह दिखेगा:

 a c 
1 1995 21 
2 1996 2 
3 1997 16 
4 1998 8 

कोई विचार?

+0

सुझाव: कॉल बातें 'c' से बचें। याद रखें कि 'सी' वैक्टर बनाने के लिए एक कार्य है। – csgillespie

+0

@csgillespie: यह वस्तुओं के लिए सच है। यह स्तंभ नामों के लिए एक बड़ा मुद्दा नहीं है। –

+1

@ जोशुआ: सच है, लेकिन (कुछ लोग) बिना सोच के 'c = df $ c' करने के लिए लुभाने वाले हो सकते हैं। – csgillespie

उत्तर

10

plyr पुस्तकालय जैसे कि ये एकत्रीकरण कार्यों के लिए उपयोगी है। plyrggplot2 ग्राफिक्स के साथ भी बहुत अच्छी तरह से खेलता है। मेरी राय में, प्लीयर का लाभ यह है कि आप स्पष्ट रूप से इनपुट और आउटपुट की संरचना को परिभाषित करते हैं। यहां हम data.frame ऑब्जेक्ट में गुज़र रहे हैं और प्रसंस्करण के बाद data.frame भी चाहते हैं, इसलिए हम ddply का उपयोग करेंगे। पहला अक्षर इनपुट ऑब्जेक्ट से मेल खाता है, और आउटपुट के लिए दूसरा। तो अगर हम एक list वस्तु से data.frame जाना चाहती थी, हम ldply का उपयोग करेंगे, आदि

library(ggplot2) #Loads plyr 

text <- "a b c 
1995 1 5 
1995 2 7 
1995 3 9 
1996 1 2 
1997 2 4 
1997 3 5 
1997 4 7 
1998 1 8 
" 

df <- read.table(textConnection(text), header = TRUE) 

#Create plotData data.frame that groups by the "a" column and returns the sum of "c" 
plotData <- ddply(df, "a", summarise, totalc = sum(c)) 

#plotting with ggplot 
qplot(factor(a), totalc, data = plotData) 
+2

अगर मैं सट्टेबाजी करने वाला व्यक्ति था, तो मैंने 'प्लीयर' उत्तर पर पैसे डाले होंगे जो सर्वश्रेष्ठ के रूप में स्वीकार किए जाते हैं। –

9
aggregate(x[,"c",drop=FALSE], by=x[,"a",drop=FALSE], sum) 

drop=FALSE subsetting x एक data.frame है के द्वारा बनाई गई वस्तु सुनिश्चित करने के लिए है। यदि आप drop=FALSE को छोड़ देते हैं तो डेटा.फ्रेम के आयाम गिर जाएंगे (क्योंकि आप केवल डेटा.फ्रेम के एक कॉलम तक पहुंच रहे हैं) और सबसेटिंग का परिणाम वेक्टर होगा। अधिक जानकारी के लिए ?"[" और ?drop देखें।

अद्यतन: मैं गेविन के साथ सहमत हैं कि सूत्र इंटरफ़ेस क्लीनर है:

aggregate(c ~ a, data=x, sum) 
+4

इस मामले में सूत्र इंटरफ़ेस का उपयोग करना आसान नहीं होगा? 'कुल (सी ~ ए, डेटा = एक्स, योग) 'इसके अलावा, आपको केवल' ड्रॉप 'संस्करण पर' ड्रॉप 'की आवश्यकता है क्योंकि यह तर्क केवल एक सूची लेता है, उदाहरण के लिए यह ठीक काम करता है:' कुल (x [ , "सी 2"], द्वारा = सूची (वर्ष = एक्स [, "सी 1"]), योग) ' –

+4

@ गैविन: सूत्र इंटरफेस के बारे में बहुत अच्छी बात है। पहली तर्क पर मैंने 'ड्रॉप' का उपयोग किया है इसलिए कॉलम का नाम नई वस्तु के माध्यम से जारी रहेगा। –

+1

अच्छा रिटॉर्ट - टच - यह नहीं देखा था कि पहला तर्क डेटा फ्रेम होने पर नाम संरक्षित किया गया था। +1। –

9

आप tapply की जरूरत है। उदाहरण के लिए,

## Your data 
c1 = c(1995, 1995, 1995, 1996, 1997, 1997, 1997, 1998) 
c2 = c(5, 7, 9, 2, 4, 5, 7, 8) 
x = data.frame(c1, c2) 


y = tapply(x$c2, x$c1, sum) 
names(y) ## For the years 
as.vector(y) 

## So to get a data frame 
data.frame(a=names(y), c=as.vector(y)) 
+0

अच्छा जवाब है, लेकिन आपको कॉलम "ए" और "सी" के साथ 'y' को डेटा.फ्रेम में बदलने के लिए एक और चरण की आवश्यकता है। –

+0

@ जोशुआ: अगर मैंने स्पष्ट नहीं किया है तो मैंने उत्तर में उस चरण को जोड़ा है। मैं वास्तव में अपना मन नहीं बना सकता कि मैं किस उत्तर को पसंद करता हूं - तुम्हारा या मेरा। – csgillespie

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