2012-04-19 15 views
12

इसे एक उदाहरणदो या दो से अधिक कारक चर के सारांश आंकड़े?

str(mtcars) 
mtcars$gear <- factor(mtcars$gear, labels=c("three","four","five")) 
mtcars$cyl <- factor(mtcars$cyl, labels=c("four","six","eight")) 
mtcars$am <- factor(mtcars$am, labels=c("manual","auto") 
str(mtcars) 
tapply(mtcars$mpg, mtcars$gear, sum) 

जो मुझे गियर प्रति अभिव्यक्त एमपीजी देता है के साथ चित्रित किया गया है। लेकिन कहें कि मैं शीर्ष पर गियर के साथ 3x3 टेबल चाहता हूं और पक्ष को नीचे रखता हूं, और 9 कोशिकाएं बिवारिएट रकम के साथ, मैं इसे 'बुद्धिमान' कैसे प्राप्त करूं।

मैं जा सकता था।

tapply(mtcars$mpg[mtcars$cyl=="four"], mtcars$gear[mtcars$cyl=="four"], sum) 
tapply(mtcars$mpg[mtcars$cyl=="six"], mtcars$gear[mtcars$cyl=="six"], sum) 
tapply(mtcars$mpg[mtcars$cyl=="eight"], mtcars$gear[mtcars$cyl=="eight"], sum) 

यह बोझिल लगता है।

फिर मैं मिश्रण में तीसरा चर कैसे लाऊंगा?

यह कुछ जगह है जहां मैं सोच रहा हूं। Summary statistics using ddply

अद्यतन यह मैं वहाँ हो जाता है, लेकिन यह काफी नहीं है।

aggregate(mpg ~ am+cyl+gear, mtcars,sum) 

चीयर्स

उत्तर

32

कैसे इस बारे में, अभी भी tapply() का उपयोग कर? यह आपको पता था की तुलना में अधिक बहुमुखी है!

with(mtcars, tapply(mpg, list(cyl, gear), sum)) 
#  three four five 
# four 21.5 215.4 56.4 
# six 39.5 79.0 19.7 
# eight 180.6 NA 30.8 

या, यदि आप मुद्रित आउटपुट चाहते हैं थोड़ा और व्याख्या हो:

with(mtcars, tapply(mpg, list("Cylinder#"=cyl, "Gear#"=gear), sum)) 

आप दो से अधिक पार वर्गीकृत चर का उपयोग करना चाहते हैं, विचार वास्तव में है वही। फिर परिणाम एक 3-या-अधिक आयामी सरणी में लौटे जाएगा:

A <- with(mtcars, tapply(mpg, list(cyl, gear, carb), sum)) 

dim(A) 
# [1] 3 3 6 
lapply(1:6, function(i) A[,,i]) # To convert results to a list of matrices 

# But eventually, the curse of dimensionality will begin to kick in... 
table(is.na(A)) 
# FALSE TRUE 
# 12 42 
+0

यह एक स्पष्ट उत्तर प्रतीत होता है, क्योंकि यह एक कारक के साथ शुरुआती बिंदु था। 'ftable' भी ब्याज का हो सकता है। –

3

मैं इस के लिए जोश के जवाब पसंद है, लेकिन reshape2 भी समस्याओं के इन प्रकार के लिए एक अच्छा रूपरेखा प्रदान कर सकते हैं:

library(reshape2) 

#use subset to only grab the variables of interest... 
mtcars.m <- melt(subset(mtcars, select = c("mpg", "gear", "cyl")), measure.vars="mpg") 
#cast into appropriate format 
dcast(mtcars.m, cyl ~ gear, fun.aggregate=sum, value.var="value") 

    cyl three four five 
1 four 21.5 215.4 56.4 
2 six 39.5 79.0 19.7 
3 eight 180.6 0.0 30.8 
+0

मैंने 'mpg" के चारों ओर उद्धरण डालने के लिए संपादित किया है, 'माप' vars' को पास किया गया है, बी/सी कोड अन्यथा मेरे लिए काम नहीं कर रहा था। क्या यह आपके लिए भी सही दिखता है? साथ ही, नीचे पंक्ति के बीच में '0' के बजाय' NA' वापस करने के लिए इसे पाने का कोई आसान तरीका है? –

+0

@ जोशो'ब्रायन - बहुत अजीब, मुझे नहीं पता कि यह पहले एमजीपी के आसपास उद्धरण के बिना क्यों काम करता था ... इसके लिए धन्यवाद। साथ ही, 'dcast' को 'fill' पैरामीटर को NA की अनुमति देनी चाहिए, लेकिन मुझे एक अजीब त्रुटि मिल रही है ... सेटिंग' fill = inf' या किसी भी अन्य संख्यात्मक मान को यद्यपि कार्य करता है। यह वही नहीं है जो मैं समारोह से अपेक्षा करता हूं ... आगे खोद जाएगा – Chase

5

मुझे लगता है कि इस प्रश्न पर पहले से ही जवाब शानदार विकल्प हैं, लेकिन मैं dplyr पैकेज के आधार पर एक अतिरिक्त विकल्प साझा करना चाहता था (यह मेरे लिए आया क्योंकि मैं अभी कक्षा पढ़ रहा हूं जहां हम डेटा मैनिपुलेशन के लिए dplyr का उपयोग करते हैं, इसलिए मैं छात्रों को विशेष आधार आर कार्यों जैसे tapply यामें पेश करने से बचना चाहता था)।

आप group_by फ़ंक्शन का उपयोग करके जितना चाहें उतने चर पर समूह कर सकते हैं और फिर इन समूहों से summarize के साथ जानकारी सारांशित कर सकते हैं। मुझे लगता है कि इस कोड, aggregate के सूत्र आधारित इंटरफेस से एक अनुसंधान नवागंतुक के लिए और अधिक पठनीय है समान परिणाम उपज:

library(dplyr) 
mtcars %>% 
    group_by(am, cyl, gear) %>% 
    summarize(mpg=sum(mpg)) 
#  am cyl gear mpg 
# (dbl) (dbl) (dbl) (dbl) 
# 1  0  4  3 21.5 
# 2  0  4  4 47.2 
# 3  0  6  3 39.5 
# 4  0  6  4 37.0 
# 5  0  8  3 180.6 
# 6  1  4  4 168.2 
# 7  1  4  5 56.4 
# 8  1  6  4 42.0 
# 9  1  6  5 19.7 
# 10  1  8  5 30.8 
दो चर के साथ

, आप उन पंक्तियों पर एक चर और स्तंभों पर दूसरे के साथ संक्षेप कर सकते हैं tidyr पैकेज से spread फ़ंक्शन की कॉल जोड़कर:

library(dplyr) 
library(tidyr) 
mtcars %>% 
    group_by(cyl, gear) %>% 
    summarize(mpg=sum(mpg)) %>% 
    spread(gear, mpg) 
#  cyl  3  4  5 
# (dbl) (dbl) (dbl) (dbl) 
# 1  4 21.5 215.4 56.4 
# 2  6 39.5 79.0 19.7 
# 3  8 180.6 NA 30.8 
0

जवाब एक ही आउटपुट tapply और समेकित फ़ंक्शन का उपयोग कर सकते हैं।

मैं जोश ओ'ब्रायन के उत्तर में कुछ जानकारी जोड़ना चाहता हूं। उपयोगकर्ता आउटपुट के आधार पर कुल फ़ंक्शन या टैप्ली का उपयोग कर सकते हैं। जोड़ी में एक से अधिक कारक चर का उपयोग करने के लिए जोश ने दिखाया है विधि का उपयोग कर सकते हैं।

डाटासेट लोड हो रहा है

data("mtcars") 

tapply का उपयोग

with(mtcars, tapply(mpg, list("Cylinder#"=cyl, "Gear#"=gear), sum)) 

ऊपर कोड के उत्पादन में

 Gear# 
Cylinder#  3  4 5 
    4  21.5 215.4 56.4 
    6  39.5 79.0 19.7 
    8 180.6 NA 30.8 

समेकित फ़ंक्शन का उपयोग करना है

with(mtcars, aggregate(mpg, list(Cylinder = cyl, Gear = gear), sum)) 

समेकित फ़ंक्शन

Cylinder Gear x 
1  4 3 21.5 
2  6 3 39.5 
3  8 3 180.6 
4  4 4 215.4 
5  6 4 79.0 
6  4 5 56.4 
7  6 5 19.7 
8  8 5 30.8 

का उत्पादन अब उपयोगकर्ता समेकित फ़ंक्शन लेकिन tapply का उपयोग कर के रूप में ही उत्पादन चाहता है। tapply समारोह के

as.data.frame(as.table(with(mtcars, tapply(mpg, list("Cylinder#"=cyl, "Gear#"=gear), 
sum)))) 

आउटपुट

Cylinder. Gear. Freq 
1   4  3 21.5 
2   6  3 39.5 
3   8  3 180.6 
4   4  4 215.4 
5   6  4 79.0 
6   8  4 NA 
7   4  5 56.4 
8   6  5 19.7 
9   8  5 30.8 

एनए के या रखा जा सकता है व्यापार आवश्यकताओं के अनुसार हटा दिया।

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