आर

2010-04-12 8 views
16

मैं आर में समारोह "द्वारा" उपयोग कर रहा हूँ एक डेटा फ्रेम ऊपर काटना और विभिन्न भागों में एक समारोह के लागू होते हैं, इस तरह करने के लिए एक डेटा फ्रेम करने के लिए एक कन्वर्ट वस्तु "से" परिणाम (Z.by) इस तरह दिखता है:आर

: 4 
: 357 
Nright Nwrong Ntied 
    3  0  0 
------------------------------------------------------------ 
: 8 
: 357 
NULL 
------------------------------------------------------------ 
: 10 
: 470 
Nright Nwrong Ntied 
    3  4  1 
------------------------------------------------------------ 
: 11 
: 470 
Nright Nwrong Ntied 
    12  4  1 

मैं चाहते हैं क्या इस परिणाम एक डेटा फ्रेम में परिवर्तित कर दिया है करने के लिए है (शून्य प्रविष्टियों मौजूद नहीं) के साथ तो यह इस तरह दिखता है:

Rater Class Nright Nwrong Ntied 
1  4 357  3  0  0 
2 10 470  3  4  1 
3 11 470  12  4  1 

मैं यह कैसे कर सकता हूं?

उत्तर

8

plyr पैकेज में के बजाय द्वारा ddply उपयोग पर विचार करें। यह कॉलम को आपके डेटा फ्रेम में जोड़ने का काम संभालता है।

16

by समारोह सूची लौटाता है, तो आप कुछ इस तरह कर सकते हैं:

data.frame(do.call("rbind", by(x, column, mean))) 
+0

करना होगा लगभग मैं क्या चाहते हैं, मैं Nright, Nwrong और Ntied कॉलम के साथ एक डेटा फ्रेम मिल करता है यही कारण है कि, लेकिन यह रेटर और कक्षा कॉलम का उत्पादन नहीं करता। –

+2

मैं उन दो फ़ील्ड को वापस करने के लिए अपने 'pairwise.compare' फ़ंक्शन को बदलने का सुझाव दूंगा। अन्यथा आपको सूची नाम और मान दोनों (जो एक अतिरिक्त चरण है) प्राप्त करने के लिए 'lapply' routine (या' plyr') का उपयोग करना होगा। – Shane

+0

ऐसा प्रतीत होता है कि इस मामले में प्लीयर वास्तव में एक आसान समाधान है, मुझे पहले उस पैकेज के बारे में पता नहीं था। –

3

पुराने धागा है, लेकिन किसी को भी इस विषय के लिए खोज करता लिए:

analysis = by(...) 
data.frame(t(vapply(analysis,unlist,unlist(analysis[[1]])))) 

unlist() एक by() उत्पादन (इस मामले में, analysis) का एक तत्व लेने के लिए और एक नामित वेक्टर के रूप में यह व्यक्त करेंगे। vapply()analysis के सभी elemnts को असूचीबद्ध करता है और परिणाम आउटपुट करता है। आउटपुट प्रकार को जानने के लिए इसे एक डमी तर्क की आवश्यकता होती है, जो analysis[[1]] है। आपको एक चेक जोड़ने की आवश्यकता हो सकती है कि यदि यह संभव हो तो विश्लेषण खाली नहीं है। प्रत्येक आउटपुट एक कॉलम होगा, इसलिए t() इसे वांछित अभिविन्यास में स्थानांतरित करता है जहां प्रत्येक विश्लेषण प्रविष्टि एक पंक्ति बन जाती है।

+0

यह समाधान काम नहीं करता है यदि आपके मिश्रित प्रकार आपके डेटा में हैं। फ्रेम (जैसे एक कॉलम में वर्ण और दूसरे में संख्याएं), क्योंकि यह 'vapply' पर निर्भर करता है। इस विशिष्ट मामले में, उपरोक्त शेन का समाधान पूरी तरह से अच्छी तरह से काम करता है। – Jealie

2

यह शेन के आरबीआईंड() का उपयोग करने के समाधान पर विस्तार करता है लेकिन समूहों को पहचानने वाले कॉलम भी जोड़ता है और नूल समूहों को हटा देता है - प्रश्न में अनुरोध की गई दो विशेषताएं। बेस पैकेज फ़ंक्शंस का उपयोग करके, कोई अन्य निर्भरता आवश्यक नहीं है, उदाहरण के लिए, प्लीयर।

simplify_by_output = function(by_output) { 
    null_ind = unlist(lapply(by_output, is.null)) # by() returns NULL for combinations of grouping variables for which there are no data. rbind() ignores those, so you have to keep track of them. 
    by_df = do.call(rbind, by_output) # Combine the results into a data frame. 
    return(cbind(expand.grid(dimnames(by_output))[!null_ind, ], by_df)) # Add columns identifying groups, discarding names of groups for which no data exist. 
} 
2

मैं

x = by(data, list(data$x, data$y), function(d) whatever(d)) 
array(x, dim(x), dimnames(x))