2013-01-05 4 views
6

किसी की मदद कर सकते हैं मुझे निम्नलिखित उदाहरण के साथ समग्र और ddply के बीच का अंतर मिलता है:अंतर

एक डेटा फ्रेम:

mydat <- data.frame(first = rpois(10,10), second = rpois(10,10), 
        third = rpois(10,10), group = c(rep("a",5),rep("b",5))) 

उपयोग कुल का एक हिस्सा करने के लिए एक समारोह लागू करने के लिए एक पहलू से डेटा फ्रेम विभाजन:

aggregate(mydat[,1:3], by=list(mydat$group), mean) 
    Group.1 first second third 
1  a 8.8 8.8 10.2 
2  b 6.8 9.4 13.4 

कोशिश एक और समारोह के लिए कुल उपयोग करने के लिए (एक त्रुटि संदेश देता है):

aggregate(mydat[,1:3], by=list(mydat$group), function(u) cor(u$first,u$second)) 
Error in u$second : $ operator is invalid for atomic vectors 

अब, ddply (plyr पैकेज) के साथ एक ही कोशिश:

ddply(mydat, .(group), function(u) cor(u$first,u$second)) 
    group   V1 
1  a -0.5083042 
2  b -0.6329968 

सभी सुझावों, लिंक, आलोचना अत्यधिक सराहना कर रहे हैं।

+0

मैं तुम्हें अंतर का प्रदर्शन किया है लगता है। या यहां कोई सवाल है? –

+3

ठीक है, जबकि मुझे लगता है कि एक अंतर है, मुझे समझ में नहीं आता कि ऐसा क्यों है। इन कार्यों के भीतर क्या अंतर दिखाता है? – skip

+2

http://programming-r-pro-bro.blogspot.com/2012/12/r-faqs-for-fresh-starters.html का भाग 5 नमूना कोड के साथ एक शानदार स्पष्टीकरण है। असल में, ddply आपको प्रत्येक चर पर अलग-अलग फ़ंक्शंस का उपयोग करने की अनुमति देगा, जबकि आपके द्वारा पारित सभी कॉलम पर एक ही फ़ंक्शन का उपयोग करने के लिए कुल बलों। –

उत्तर

12

aggregate प्रत्येक कॉलम पर स्वतंत्र रूप से कॉल करता है, यही कारण है कि आपको स्वतंत्र साधन मिलते हैं। ddply फ़ंक्शन में सभी कॉलम पास करने जा रहा है। क्या aggregate भेजी जा रही है की एक त्वरित प्रदर्शन के क्रम में हो सकता है:

प्रदर्शन के लिए कुछ नमूना डेटा:

d <- data.frame(a=1:4, b=5:8, c=c(1,1,2,2)) 

> d 
    a b c 
1 1 5 1 
2 2 6 1 
3 3 7 2 
4 4 8 2 

समारोह print का उपयोग कर और आदेशों aggregate या ddply, हम कर सकते हैं का परिणाम अनदेखी करके देखें कि प्रत्येक पुनरावृत्ति में फ़ंक्शन को क्या पास किया जाता है।

aggregate:

tmp <- aggregate(d[1:2], by=list(d$c), print) 
[1] 1 2 
[1] 3 4 
[1] 5 6 
[1] 7 8 

ध्यान दें कि अलग-अलग स्तंभों मुद्रित करने के लिए भेजा जाता है।

ddply:

tmp <- ddply(d, .(c), print) 
    a b c 
1 1 5 1 
2 2 6 1 
    a b c 
3 3 7 2 
4 4 8 2 

ध्यान दें कि डेटा फ्रेम मुद्रित करने के लिए भेजे जा रहे हैं।

+0

कूल, धन्यवाद: पहले दो वाक्यों में वही है जो मैं ढूंढ रहा था। – skip

+0

@ अरुण जो मैंने चिपकाया वह 'कुल' के भीतर 'प्रिंट' से आउटपुट है। मैंने 'कुल' से परिणाम छोड़ा जो इस उदाहरण के लिए महत्वपूर्ण नहीं है। बेहतर जवाब देने के लिए मैं जवाब संपादित कर दूंगा। –

6

@ मैथ्यूलंडबर्ग का उत्तर बहुत अच्छा है, मेरा यह जवाब नहीं है, लेकिन यह एक सामान्य संकेत है जिसका उपयोग मैं कुछ आर फंक्शंस कॉल के पीछे क्या होता हूं, जब मैं देखना चाहता हूं। मैं डीबग कमांड browser का उपयोग करता हूं।

aggregate(mydat[,1:3], by=list(mydat$group), 
+   function(x){ 
+    browser() 
+    mean(x) 
+   }) 
Called from: FUN(X[[1L]], ...) 
Browse[1]> x 
[1] 16 10 16 13 25 
तो

कारण है कि आप आप के रूप में एक त्रुटि

aggregate(mydat[,1:3], by=list(mydat$group), function(u) { 
+ browser() 
+ cor(u$first,u$second) 
+ }) 
Called from: FUN(X[[1L]], ...) 
Browse[1]> u 
[1] 16 10 16 13 25  

मिल

यहाँ मैं तकनीक का उपयोग करें देखने के लिए ddply

ddply(mydat, .(group), function(u) { 
+ browser() 
+ cor(u$first,u$second) 
+ }) 
Called from: .fun(piece, ...) 
Browse[1]> u 
    first second third group 
1 16  8  9  a 
2 10  6  6  a 
3 16  6 10  a 
4 13  8 10  a 
5 25  10  4  a 

संपादित करें खुद के द्वारा त्रुटि डिबग के लिए यहां देखें कि आप परमाणु वेक्टर (कॉलम नामों के बिना)है

Error in u$first : $ operator is invalid for atomic vectors 
7

आप पहले से ही क्यों aggregate गलत {आधार} समारोह एक समारोह है कि तर्क के रूप में दो वैक्टर की आवश्यकता है के लिए उपयोग किया गया बताया गया है:तो अगर आप कोशिश

Browse[1]> u$first 

आप कोई त्रुटि मिलती है , लेकिन आपको अभी तक यह नहीं बताया गया है कि गैर-डीप्ली दृष्टिकोण सफल हो गया होगा।

by(... grp, FUN) विधि:

> cbind (by(mydat, mydat["group"], function(d) cor(d$first, d$second))) 
     [,1] 
a 0.6529822 
b -0.1964186 

sapply(split(..., grp), fn) विधि

> sapply( split(mydat, mydat["group"]), function(d) cor(d$first, d$second)) 
     a   b 
0.6529822 -0.1964186 
+1

जब मैं 'plyr/ddply' का सहारा लेता हूं, तो मैं हमेशा दोषी महसूस करता हूं, क्योंकि मेरा मतलब है कि मैं असफल रहा या बहुत ही अधीर समझ रहा था, कुल, या tapply। ध्यान दें कि 'ddply' इतना सामान्य है कि यह बड़ी समस्याओं के लिए धीमा हो सकता है। डीडीप्ली का एक तेज संस्करण यहां बढ़ रहा है: https://github.com/hadley/dplyr। –