2013-08-05 11 views
5

सारांशित करें मुझे plyr पैकेज से ddply फ़ंक्शन का उपयोग करके कुछ परेशानी हो रही है। मैं निम्नलिखित समूह को प्रत्येक समूह के भीतर गणना और अनुपात के साथ सारांशित करने का प्रयास कर रहा हूं। मेरे कॉल ddply उपयोग कर रहा है यहाँddply आनुपातिक गणना

structure(list(X5employf = structure(c(1L, 3L, 1L, 1L, 1L, 3L, 
1L, 1L, 1L, 3L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 1L, 2L, 2L, 2L, 
2L, 2L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 1L, 1L, 3L, 1L, 
3L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 
3L, 3L, 1L), .Label = c("increase", "decrease", "same"), class = "factor"), 
    X5employff = structure(c(2L, 6L, NA, 2L, 4L, 6L, 5L, 2L, 
    2L, 8L, 2L, 2L, 2L, 7L, 7L, 8L, 11L, 7L, 2L, 8L, 8L, 11L, 
    7L, 6L, 2L, 5L, 2L, 8L, 7L, 7L, 7L, 8L, 6L, 7L, 5L, 5L, 7L, 
    2L, 6L, 7L, 2L, 2L, 2L, 2L, 2L, 5L, 5L, 5L, 2L, 5L, 2L, 2L, 
    2L, 5L, 12L, 2L, 2L, 2L, 2L, 5L, 5L, 5L, 5L, 2L, 5L, 2L, 
    13L, 9L, 9L, 9L, 7L, 8L, 5L), .Label = c("", "1", "1 and 8", 
    "2", "3", "4", "5", "6", "6 and 7", "6 and 7 ", "7", "8", 
    "1 and 8"), class = "factor")), .Names = c("X5employf", "X5employff" 
), row.names = c(NA, 73L), class = "data.frame") 

और:: यहाँ अपने डेटा है

ddply(kano_final, .(X5employf, X5employff), summarise, n=length(X5employff), prop=(n/sum(n))*100) 

यह मैं X5employff सही ढंग को हमेशा मायने रखता है देता है, लेकिन लेकिन जैसे कि अनुपात प्रत्येक पंक्ति में गणना की जा रही है लगता है और कारक X5employf के प्रत्येक स्तर के भीतर नहीं इस प्रकार है:

X5employf X5employff n prop 
1 increase   1 26 100 
2 increase   2 1 100 
3 increase   3 15 100 
4 increase 1 and 8 1 100 
5 increase  <NA> 1 100 
6 decrease   4 1 100 
7 decrease   5 5 100 
8 decrease   6 2 100 
9 decrease   7 1 100 
10 decrease   8 1 100 
11  same   4 4 100 
12  same   5 6 100 
13  same   6 5 100 
14  same 6 and 7 3 100 
15  same   7 1 100 

मैन्युअल रूप से प्रत्येक समूह मैं इस मिल के भीतर अनुपात की गणना करते समय:

X5employf X5employff n prop 
1 increase   1 26 59.09 
2 increase   2 1 2.27 
3 increase   3 15 34.09 
4 increase 1 and 8 1 2.27 
5 increase  <NA> 1 2.27 
6 decrease   4 1 10.00 
7 decrease   5 5 50.00 
8 decrease   6 2 20.00 
9 decrease   7 1 10.00 
10 decrease   8 1 10.00 
11  same   4 4 21.05 
12  same   5 6 31.57 
13  same   6 5 26.31 
14  same 6 and 7 3 15.78 
15  same   7 1 5.26 

आप कारक X5employf के प्रत्येक स्तर में अनुपात के योग देख सकते हैं 100

के बराबर होती है मैं जानता हूँ कि यह शायद हास्यास्पद सरल है, लेकिन मैं पढ़ने के बावजूद उसके चारों ओर मेरे सिर पाने के लिए नहीं कर पा रहे समान पदों के सभी प्रकार। क्या कोई इस बारे में और मेरी समझ में मदद कर सकता है कि संक्षेप में फ़ंक्शन कैसे काम करता है ?!

कई, बहुत धन्यवाद

मार्टी

+0

में यह पता चला है कि 'राशि (एन)' गणना की जा रही है वांछित – Metrics

उत्तर

6

आप एक ddply कॉल में यह नहीं कर सकते, क्योंकि जो प्रत्येक summarize कॉल को दिया गया हो जाता है अपने समूह चर का एक विशेष संयोजन के लिए अपने डेटा के एक उपसमूह है। इस निम्नतम स्तर पर, आपके पास उस मध्यवर्ती स्तर sum(n) तक पहुंच नहीं है। इसके बजाय, दो चरणों में कर:

kano_final <- ddply(kano_final, .(X5employf), transform, 
        sum.n = length(X5employf)) 

ddply(kano_final, .(X5employf, X5employff), summarise, 
     n = length(X5employff), prop = n/sum.n[1] * 100) 

संपादित: एक ही ddply कॉल का उपयोग करके और table का उपयोग कर के रूप में आप संकेत दिया की ओर:

ddply(kano_final, .(X5employf), summarise, 
     n   = Filter(function(x) x > 0, table(X5employff, useNA = "ifany")), 
     prop  = 100* prop.table(n), 
     X5employff = names(n)) 
+0

धन्यवाद flodel के रूप में, यह है कि मैं वास्तव में क्या चाहता था। क्या इसे एक ही कॉल में जोड़ने का कोई तरीका है? मैं एक काफी बड़े डेटासेट को सारांशित करने की कोशिश कर रहा हूं और एक बिंदु पर पहुंचने की कोशिश कर रहा हूं जहां मैं इसके लिए एक स्क्रिप्ट लिख सकता हूं, इसलिए प्रत्येक मामले में मुझे केवल एक समूहबद्ध चर और 'मापा' चर डालना होगा, इस उदाहरण के लिए थोड़ा किसी डेटासेट के भीतर समूहों के आत्मविश्वास अंतराल की गणना करना: http://www.cookbook-r.com/Manipulating_data/Summarizing_data/ –

+0

ओह और अभी भी 'ट्रांसफॉर्म' और 'सारांश' के बीच के अंतर के बारे में पूरी तरह से सुनिश्चित नहीं है !? –

+0

'ट्रांसफॉर्म' आपके डेटा की प्रत्येक पंक्ति में जोड़ता है (जैसे कि 'सारांश' फ़ंक्शन करता है), जबकि 'संक्षेप' आपके डेटा को एकत्रित करेगा (जैसे आधार 'कुल' फ़ंक्शन करता है)। – flodel

0

करने के लिए क्या आप जाहिरा तौर पर क्या करना चाहते है X5employf के प्रत्येक मान के लिए X5employff के अनुपात का पता लगाएं। हालांकि, आप यह नहीं बताते कि X5employf और X5employff अलग हैं; ddply करने के लिए, डेटा को विभाजित करने के लिए ये दो चर केवल दो चर हैं। साथ ही, चूंकि प्रति पंक्ति एक अवलोकन है, यानी डेटा की प्रत्येक पंक्ति के लिए गिनती = 1, प्रत्येक (X5employf, X5employff) संयोजन की लंबाई प्रत्येक (X5employf, X5employff) संयोजन के योग के बराबर होती है।

result <- ddply(kano_final, .(X5employf, X5employff), summarise, n=length(X5employff), drop=FALSE) 
n <- result$n 
n2 <- ddply(kano_final, .(X5employf), summarise, n=length(X5employff))$n 
result <- data.frame(result, prop=n/rep(n2, each=13)*100) 

तुम भी उपयोग कर सकते हैं अच्छे पुराने xtabs:

a <- xtabs(~X5employf + X5employff, kano_final) 
b <- xtabs(~X5employf, kano_final) 
a/matrix(b, nrow=3, ncol=ncol(a)) 
+0

आपके प्लीयर समाधान और @ फ़्लोडेल के बीच क्या अंतर है? – Metrics

+0

एक अंतर मुझे लगता है कि मैं हार्डकोडेड 'प्रत्येक = 13' का उपयोग नहीं करता हूं। यह अच्छी तरह से सामान्य नहीं होगा ... – flodel

+0

धन्यवाद, यह मुझे समझने के करीब है कि क्या हो रहा है। मैंने यह पाया जो कि आसान लगता है, लेकिन मुझे वास्तव में समझ में नहीं आता कि क्या हो रहा है: 'df.new <-ddply (kano_final,। (X5employf), सारांश, प्रोप = prop.table (तालिका (X5employff)), X5employff = नाम (तालिका (X5employff))) 'हालांकि यह काम करने लगता है ... लेकिन' गिनती 'कॉलम नहीं जोड़ता है। मुझे इस सब के पीछे कारण का उल्लेख करना चाहिए था ताकि मैं या तो ggplot2 या इसी तरह के परिणामों का आवृत्ति गणना या आवृत्ति प्रतिशत बार साजिश का साजिश कर सकूं ... –

1

मैं यहां जोड़ा गया

सरल "plyr रास्ता" अपनी समस्या यह है कि मैं के बारे में सोच सकते हैं हल करने के लिए

पीछा कर रहा है एक उदाहरण के साथ एक उदाहरण, जो एक छोटे से कोड और आसानी से पढ़ा सिंटैक्स के साथ एक कदम में काफी आसानी से बनाता है।

डी आपका डेटा है।फ्रेम

library(dplyr) 
d%.% 
    dplyr:::group_by(X5employf, X5employff) %.% 
    dplyr:::summarise(n = length(X5employff)) %.% 
    dplyr:::mutate(ngr = sum(n)) %.% 
    dplyr:::mutate(prop = n/ngr*100) 

परिणाम होगा

Source: local data frame [15 x 5] 
Groups: X5employf 

    X5employf X5employff n ngr  prop 
1 increase   1 26 44 59.090909 
2 increase   2 1 44 2.272727 
3 increase   3 15 44 34.090909 
4 increase 1 and 8 1 44 2.272727 
5 increase   NA 1 44 2.272727 
6 decrease   4 1 10 10.000000 
7 decrease   5 5 10 50.000000 
8 decrease   6 2 10 20.000000 
9 decrease   7 1 10 10.000000 
10 decrease   8 1 10 10.000000 
11  same   4 4 19 21.052632 
12  same   5 6 19 31.578947 
13  same   6 5 19 26.315789 
14  same 6 and 7 3 19 15.789474 
15  same   7 1 19 5.263158 
संबंधित मुद्दे