2011-01-29 6 views
6

मान लीजिए कि मैं डेटासेट mtcars (बेस आर संस्करण 2.12.1 का हिस्सा) पर कुछ सारांश आंकड़े प्राप्त करना चाहता हूं। नीचे, मैं कारों को इंजन सिलेंडरों की संख्या के अनुसार समूहित करता हूं और mtcars में शेष चर के प्रति-समूह माध्यमों को लेता हूं।यदि मेरा ग्रुपिंग चर एक कारक है तो मैं समूह सारांश आंकड़ों को कैसे उत्पन्न कर सकता हूं?

> str(mtcars) 
'data.frame': 32 obs. of 11 variables: 
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... 
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ... 
$ disp: num 160 160 108 258 360 ... 
$ hp : num 110 110 93 110 175 105 245 62 95 123 ... 
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... 
$ wt : num 2.62 2.88 2.32 3.21 3.44 ... 
$ qsec: num 16.5 17 18.6 19.4 17 ... 
$ vs : num 0 0 1 1 0 1 0 1 1 1 ... 
$ am : num 1 1 1 0 0 0 0 0 0 0 ... 
$ gear: num 4 4 4 3 3 3 3 4 4 4 ... 
$ carb: num 4 4 1 1 2 1 4 2 2 4 ... 
> ddply(mtcars, .(cyl), mean) 
     mpg cyl  disp  hp  drat  wt  qsec  vs  am  gear 
1 26.66364 4 105.1364 82.63636 4.070909 2.285727 19.13727 0.9090909 0.7272727 4.090909 
2 19.74286 6 183.3143 122.28571 3.585714 3.117143 17.97714 0.5714286 0.4285714 3.857143 
3 15.10000 8 353.1000 209.21429 3.229286 3.999214 16.77214 0.0000000 0.1428571 3.285714 
     carb 
1 1.545455 
2 3.428571 
3 3.500000 

लेकिन, यदि मेरा समूह चर एक कारक चीजें होती है तो चीजें कठिन हो जाती हैं। ddply() कारक के प्रत्येक स्तर, के लिए चेतावनी फेंकता है क्योंकि कोई कारक के mean() नहीं ले सकता है।

> mtcars$cyl <- as.factor(mtcars$cyl) 
> str(mtcars) 
'data.frame': 32 obs. of 11 variables: 
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... 
$ cyl : Factor w/ 3 levels "4","6","8": 2 2 1 2 3 2 3 1 1 2 ... 
$ disp: num 160 160 108 258 360 ... 
$ hp : num 110 110 93 110 175 105 245 62 95 123 ... 
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... 
$ wt : num 2.62 2.88 2.32 3.21 3.44 ... 
$ qsec: num 16.5 17 18.6 19.4 17 ... 
$ vs : num 0 0 1 1 0 1 0 1 1 1 ... 
$ am : num 1 1 1 0 0 0 0 0 0 0 ... 
$ gear: num 4 4 4 3 3 3 3 4 4 4 ... 
$ carb: num 4 4 1 1 2 1 4 2 2 4 ... 
> ddply(mtcars, .(cyl), mean) 
     mpg cyl  disp  hp  drat  wt  qsec  vs  am  gear 
1 26.66364 NA 105.1364 82.63636 4.070909 2.285727 19.13727 0.9090909 0.7272727 4.090909 
2 19.74286 NA 183.3143 122.28571 3.585714 3.117143 17.97714 0.5714286 0.4285714 3.857143 
3 15.10000 NA 353.1000 209.21429 3.229286 3.999214 16.77214 0.0000000 0.1428571 3.285714 
     carb 
1 1.545455 
2 3.428571 
3 3.500000 
Warning messages: 
1: In mean.default(X[[2L]], ...) : 
    argument is not numeric or logical: returning NA 
2: In mean.default(X[[2L]], ...) : 
    argument is not numeric or logical: returning NA 
3: In mean.default(X[[2L]], ...) : 
    argument is not numeric or logical: returning NA 
> 

तो, मुझे आश्चर्य है कि क्या मैं सारांश आंकड़ों को गलत तरीके से उत्पन्न करने जा रहा हूं।

कोई आम तौर पर उप-कारक या समूह सारांश आंकड़ों (जैसे साधन, मानक विचलन इत्यादि) के डेटा संरचनाओं को कैसे उत्पन्न करता है? क्या मुझे ddply() के अलावा कुछ और उपयोग करना चाहिए? यदि मैं ddply() का उपयोग कर सकता हूं, तो मैं अपने समूह कारक का अर्थ लेने का प्रयास करते समय त्रुटियों से बचने के लिए क्या कर सकता हूं?

उत्तर

8

numcolwise(mean) का उपयोग करें: numcolwise फ़ंक्शन एक तर्क में अपने तर्क (एक फ़ंक्शन) को परिवर्तित करता है जो केवल संख्यात्मक कॉलम पर चलता है (और स्पष्ट/कारक कॉलम को अनदेखा करता है)।

> ddply(mtcars, .(cyl), numcolwise(mean)) 

     cyl  mpg  disp  hp  drat  wt  qsec  vs 
    1 4 26.66364 105.1364 82.63636 4.070909 2.285727 19.13727 0.9090909 
    2 6 19.74286 183.3143 122.28571 3.585714 3.117143 17.97714 0.5714286 
    3 8 15.10000 353.1000 209.21429 3.229286 3.999214 16.77214 0.0000000 
      am  gear  carb 
    1 0.7272727 4.090909 1.545455 
    2 0.4285714 3.857143 3.428571 
    3 0.1428571 3.285714 3.500000 
+1

धन्यवाद प्रसाद! मुझे यह भी एहसास नहीं हुआ कि मैं 'ddply() 'कॉल के बजाय' कुल() 'कॉल का उपयोग कर सकता हूं। उदाहरण के लिए: 'कुल (cbind (एचपी, एमपीजी) ~ सिल, डेटा = mtcars, मतलब)'। – briandk

+0

यह भी करने का एक अच्छा तरीका है! –

+0

प्रसाद, यह एक आसान चाल है। –

2

यहां कोई जवाब नहीं है, लेकिन एक अवलोकन। यह ddply() प्रति से एक मुद्दा नहीं है। इसे देखो।

aggregate(mtcars, by=list(mtcars$cyl), mean) 
apply(mtcars, 2, function(col) tapply(col, INDEX=mtcars$cyl, FUN=mean)) 

लेकिन उसके बाद mtcars$cyl <- as.factor(mtcars$cyl) ऊपर काम का न, क्योंकि आर कैसे कारकों में से एक स्तंभ का मतलब लेने के लिए पता नहीं है: निम्न दोनों काम ठीक साधन की एक तालिका का निर्माण करने के। हम उस स्तंभ को हटाने के द्वारा यह बच सकते हैं बातें mean() के लिए पारित से ("cyl" कॉलम 2):

aggregate(mtcars[ , -2], by=list(mtcars$cyl), mean) 
apply(mtcars[ , -2], 2, function(col) tapply(col, INDEX=mtcars$cyl, FUN=mean)) 

लेकिन वह बहुत भद्दा है।

+0

धन्यवाद! मैंने खुद को कोशिश की, और आप बिल्कुल सही हैं: समस्या यह है कि आर को पता नहीं है कि कारक का मतलब कैसे लेना है, और मैं इसके आसपास आने के तरीकों से जूझ रहा था। आपका तरीका निश्चित रूप से काम करता है, हालांकि 'कुल()' आपको निर्दिष्ट करता है कि कौन से कॉलम भी शामिल हैं: 'कुल (cbind (hp, mpg) ~ cyl, data = mtcars, mean)' – briandk

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

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