2013-02-21 9 views
12

का उपयोग कर मुझे ddply या कुल के साथ स्तरों में समूह का उपयोग करने की आवश्यकता है यदि यह आसान है। मुझे सच में यकीन नहीं है कि यह कैसे करना है क्योंकि मुझे अपने कुल कार्य के रूप में cumsum का उपयोग करने की आवश्यकता है।cumsum ddply

level1  level2 hour  product 
A   tea  0   7 
A   tea  1   2 
A   tea  2   9 
A   coffee 17   7 
A   coffee 18   2 
A   coffee 20   4 
B   coffee 0   2 
B   coffee 1   3 
B   coffee 2   4 
B   tea  21   3 
B   tea  22   1 

अपेक्षित आउटपुट: यह मेरा डेटा ऐसा दिखाई देता है

A  tea  0 7 
A  tea  1 9 
A  tea  2 18 
A  coffee 17 7 
A  coffee 18 9 
A  coffee 20 13 
B  coffee 0 2 
B  coffee 1 5 
B  coffee 2 9 
B  tea  21 3 
B  tea  22 4 

मैं

ddply(dd,c("level1","level2","hour"),summarise,cumsum(product)) 

का उपयोग कर की कोशिश की, लेकिन वह जो मुझे लगता है कि है योग नहीं है क्योंकि घंटे स्तंभ समूह के लिए इसका उपयोग किया जा रहा है और इसके द्वारा विभाजित किया जा रहा है .. मुझे लगता है .. मुझे यकीन नहीं है कि मैं पूरी तरह से समझता हूं कि यहां कुल योग कैसे काम करता है। क्या कोई तरीका है कि मैं कुल या ddply का उपयोग कर आवश्यक आउटपुट प्राप्त कर सकता हूं?

+0

मुझे नहीं लगता कि आप, level1 + level2 + घंटे के हिसाब से संक्षेप में प्रस्तुत करने क्योंकि तब, अपने एकत्रीकरण तुम क्या दिखाया है से अलग होगी मतलब:

यहाँ aggregate और इसके उत्पादन है। – A5C1D2H2I1M1N2O1R2T1

उत्तर

16

यहाँ ave और within का उपयोग कर आधार आर में एक समाधान है:

within(mydf, { 
    cumsumProduct <- ave(product, level1, level2, FUN = cumsum) 
}) 
# level1 level2 hour product cumsumProduct 
# 1  A tea 0  7    7 
# 2  A tea 1  2    9 
# 3  A tea 2  9   18 
# 4  A coffee 17  7    7 
# 5  A coffee 18  2    9 
# 6  A coffee 20  4   13 
# 7  B coffee 0  2    2 
# 8  B coffee 1  3    5 
# 9  B coffee 2  4    9 
# 10  B tea 21  3    3 
# 11  B tea 22  1    4 
बेशक

, आप मौजूदा उत्पाद स्तंभ ड्रॉप करना चाहते थे, आप मौजूदा "उत्पाद" कॉलम को ओवरराइट करने के लिए निम्न में निम्न आदेश को बदल सकते हैं:

within(mydf, { 
    product <- ave(product, level1, level2, FUN = cumsum) 
}) 

आपका वर्तमान दृष्टिकोण भाग में काम नहीं करता है क्योंकि आपने अपने समूह चर के रूप में "घंटा" शामिल किया है। दूसरे शब्दों में, यह "ए + चाय + 0" के संयोजन को "ए + चाय + 1" से अलग के रूप में देख रहा है, लेकिन आपके वांछित आउटपुट से, आप बस "ए + चाय" के संयोजन को चाहते हैं समूह।

aggregate आपकी अपेक्षा के अनुसार काम नहीं करेगा, क्योंकि यह इस मामले में 4 स्तरों के "स्तर 1" और "स्तर 2" के अद्वितीय संयोजनों की संख्या के साथ data.frame में सभी चीजों को सघन करेगा। समेकित कॉलम list होगा। मान सही होंगे, लेकिन यह कम उपयोगी होगा।

> aggregate(product ~ level1 + level2, mydf, cumsum) 
    level1 level2 product 
1  A coffee 7, 9, 13 
2  B coffee 2, 5, 9 
3  A tea 7, 9, 18 
4  B tea  3, 4 
+0

धन्यवाद! यह काम करता है :) तो जब आप उत्पाद, स्तर 1 और लेवल 2 देते हैं तो तीन कॉलम के रूप में आप इन 3 और समूह को अलग-अलग चुनने के लिए कह रहे हैं? – Roshini

+1

'एवी' केवल एक वैरिएबल (पहले वाला) पर फ़ंक्शन को लागू करता है जितना आवश्यक हो उतने अन्य चर द्वारा समूहित किया जाता है। इस वजह से, * FUN' का उपयोग * पहले * चर पर जो भी फ़ंक्शन लागू करना चाहते हैं उसे कॉल करने के लिए किया जाना चाहिए। – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto लोगों को सिखाने का नुकसान यह है कि यह नई परिस्थितियों के साथ-साथ सामान्यीकृत नहीं करता है, और समूहिंग चर के संयोजन को दुर्लभ होने पर यह _really_ अक्षम भी है (दुर्भाग्य से यह एक साधारण बग है जिसे आर-कोर तय नहीं किया गया है)। – hadley

7

आप transformsummarise के बजाय का उपयोग करना चाहिए:

# you should probably order your `level2` first 
dd$level2 <- factor(dd$level2, levels=c("tea", "coffee")) 
# and transform using level1 and level2 alone, not hour 
# if you use hour, the groups will be for each row 
ddply(dd, .(level1, level2), transform, product=cumsum(product)) 

# level1 level2 hour product 
# 1  A tea 0  7 
# 2  A tea 1  9 
# 3  A tea 2  18 
# 4  A coffee 17  7 
# 5  A coffee 18  9 
# 6  A coffee 20  13 
# 7  B tea 21  3 
# 8  B tea 22  4 
# 9  B coffee 0  2 
# 10  B coffee 1  5 
# 11  B coffee 2  9 
+0

आपके उत्तर के लिए धन्यवाद ... लेकिन अगर मेरे पास स्तर 2 में 2 से अधिक स्तर हैं। आसानी से एक परिदृश्य हो सकता है कि मेरे पास लगभग 10 या अधिक स्तर हो सकते हैं, क्या मुझे उन्हें हर बार एक वेक्टर में रखना होगा? – Roshini

+1

'डीडी $ स्तर 2 <- कारक (डीडी $ स्तर 2, स्तर = डीडी $ स्तर 2 [! डुप्लिकेट (डीडी $ स्तर 2)], आदेश दिया गया = टी)' – Arun

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