2013-04-19 10 views
5

में प्रति आईडी के सभी पिछले अवलोकनों के रोलिंग औसत का निर्माण करना मैं असंतुलित डेटा सेट के रोलिंग माध्यमों की गणना करने की कोशिश कर रहा हूं। मेरी बात उदाहरण देकर स्पष्ट करने मैं अपने डेटा के इस खिलौने उदाहरण का उत्पादन किया है:एक असंतुलित पैनल डेटा सेट

ID year Var RollingAvg(Var) 
1 2000 2  NA 
1 2001 3  2 
1 2002 4  2.5 
1 2003 2  3 
2 2001 2  NA 
2 2002 5  2 
2 2003 4  3.5 

स्तंभ RollingAvg(Var) जो मैं चाहता है, लेकिन नहीं मिल सकता है। शब्दों में, मैं प्रत्येक ID के लिए Var के सभी पिछले अवलोकनों के रोलिंग औसत की तलाश में हूं। मैंने और ddplyzoo और plyr पैकेज में plyr पैकेज का उपयोग करने का प्रयास किया है, लेकिन मैं नहीं देख सकता कि प्रत्येक आईडी के लिए पिछले सभी अवलोकनों का उपयोग करने के लिए रोलिंग विंडो की लंबाई कैसे सेट करें। शायद मुझे इसके बजाय पीएलएम पैकेज का उपयोग करना चाहिए? किसी भी मदद की सराहना की है।

मैंने बैलेंस्ड पैनल डेटा सेट पर रोलिंग माध्यमों पर अन्य पोस्ट देखी हैं, लेकिन मैं असंतुलित डेटा के अपने उत्तरों को बाहर निकालने के लिए प्रतीत नहीं कर सकता।

धन्यवाद,

एम

+0

मुझे नहीं पता समझें कि 'रोलिंगएवीजी (वार) 'एनए' की 5 वीं पंक्ति क्यों है? –

+0

मुझे लगता है कि यह प्रत्येक 'आईडी' – Metrics

+0

के लिए कंप्यूटिंग कर रहा है क्या आपका अपेक्षित आउटपुट सही है? – Metrics

उत्तर

7

data.table का उपयोग करना:

library(data.table) 
d = data.table(your_df) 

d[, RollingAvg := {avg = cumsum(Var)/seq_len(.N); 
        c(NA, avg[-length(avg)])}, 
    by = ID] 

(या यहां तक ​​कि सरलीकृत)

d[, RollingAvg := c(NA, head(cumsum(Var)/(seq_len(.N)), -1)), by = ID] 
+2

आपको 'डेटाटीबल' के साथ कभी भी 'डीटी $ x = ...' का उपयोग नहीं करना चाहिए, यह पूरी तालिका की प्रतिलिपि बनाता है, जो ठीक है जो वह करने की कोशिश नहीं करता है। इसके बजाय ': =' का उपयोग करें (विग्नेट पढ़ें) – statquant

+0

पर्याप्त उचित, निश्चित – eddi

+0

@eddi: धन्यवाद, यह काम करता है! अभी भी यह समझने की कोशिश कर रहा है कि क्या हो रहा है, लेकिन मैं शायद वहां पहुंचूंगा :) क्या आपके उत्तर को विस्तारित करना संभव है ताकि पहले 2 अवलोकनों को केवल पहले के बजाय 'एनए' कोडित किया जा सके? (मुझे पता है कि यह मूल प्रश्न में नहीं है) – Mace

2

यह मानते हुए कि वर्ष प्रत्येक आईडी के भीतर सन्निहित हैं (जिसमें मामला है उदाहरण डेटा) और DF इनपुट डेटा फ्रेम है, वह फिर एक समाधान है का उपयोग करते हुए सिर्फ आधार आर cumRoll एक समारोह है कि एक आईडी पर आवश्यक कार्रवाई निष्पादित करता है और ave तो आईडी के आधार पर यह प्रदर्शन करती है:

cumRoll <- function(x) c(NA, head(cumsum(x)/seq_along(x), -1)) 
DF$Roll <- ave(DF$Var, DF$ID, FUN = cumRoll) 

परिणाम है:

> DF 
    ID year Var Roll 
1 1 2000 2 NA 
2 1 2001 3 2.0 
3 1 2002 4 2.5 
4 1 2003 2 3.0 
5 2 2001 2 NA 
6 2 2002 5 2.0 
7 2 2003 4 3.5 
संबंधित मुद्दे