2013-02-21 35 views
7

के सबसेट के भीतर अनुपात की गणना करें मैं डेटा फ्रेम के सबसेट के भीतर अनुपात प्राप्त करने का प्रयास कर रहा हूं। उदाहरण के लिए, इस बना हुआ डेटा फ्रेम में:डेटा फ्रेम

DF<-data.frame(category1=rep(c("A","B"),each=9), 
    category2=rep(rep(LETTERS[24:26],each=3),2), 
    animal=rep(c("dog","cat","mouse"),6),number=sample(18)) 

मैं category2 संयोजन (जैसे, सभी जानवरों है कि दोनों "एक हैं से बाहर करके प्रत्येक category1 के लिए तीन जानवरों में से प्रत्येक के अनुपात में गणना करने के लिए की तरह चाहते हैं "और" एक्स ", कुत्ते क्या अनुपात हैं?)। डेटा फ्रेम के कॉलम 4 पर prop.table के साथ मैं अनुपात प्राप्त कर सकता हूं कि प्रत्येक पंक्ति कुल "संख्या" कॉलम से बना है, लेकिन मुझे श्रेणी 1 और 2 के आधार पर सबसेट के लिए ऐसा करने का कोई तरीका नहीं मिला है। मैंने विभाजन करने की भी कोशिश की category1 और category2 से डेटा का उपयोग कर इस:

splitDF<-split(DF,list(DF$category1,DF$category2)) 

और मैं उम्मीद कर रही थी मैं तो प्रत्येक विभाजन समूह के भीतर प्रत्येक जानवर के अनुपात को प्राप्त करने के लिए prop.table के साथ एक समारोह लागू हो सकते हैं, लेकिन मैं prop.table काम नहीं कर प्राप्त कर सकते हैं, क्योंकि मैं कर सकते हैं ' प्रतीत होता है कि विभाजित समूहों के भीतर फ़ंक्शन को लागू करने के लिए डेटा का कौन सा कॉलम निर्दिष्ट करता है। क्या किसी के भी पास कोई भी सुझाव है? शायद यह plyr या कुछ समान के साथ संभव है? मुझे डेटा के डेटा के सबसेट्स अनुपात प्राप्त करने के तरीकों के बारे में मदद मंचों में कुछ भी नहीं मिल रहा है।

उत्तर

6

आप प्रत्येक संयोजन के अनुपात की गणना करने के लिए लाइब्रेरी plyr से फ़ंक्शन ddply() का उपयोग कर सकते हैं और फिर डेटा फ्रेम में नया कॉलम जोड़ सकते हैं।

library(plyr)  
DF<-ddply(DF,.(category1,category2),transform,prop=number/sum(number)) 
DF 
    category1 category2 animal number  prop 
1   A   X dog  17 0.44736842 
2   A   X cat  3 0.07894737 
3   A   X mouse  18 0.47368421 
4   A   Y dog  2 0.14285714 
+0

यह वास्तव में अच्छा और साफ है। बहुत बहुत धन्यवाद, Didzis! प्लीयर इस तरह के कई मुद्दों का समाधान प्रतीत होता है, लेकिन इसे इस्तेमाल करने में मुझे कुछ समय लग रहा है! – user2093526

3

क्या यह आपके वांछित आउटपुट का उत्पादन करता है?

DF$proportion<-as.vector(unlist(tapply(DF$number,paste(DF$category1,DF$category2,sep="."),FUN=function(x){x/sum(x)}))); 
+0

हां, यह करता है (जैसा कि डिज़िस का जवाब प्लीयर का उपयोग करता है)। मदद के लिए आपका बहुत बहुत धन्यवाद! – user2093526