2015-04-09 3 views
6

है, मैं डेटासेट में पिछले 4 मानों का रोलिंग माध्य करना चाहता हूं। हालांकि, शुरुआत के लिए, क्योंकि 4 मान नहीं हैं, मैं 1/2/3 अवलोकनों के रोलिंग माध्य को करना चाहता हूं। मैं यह कैसे करु?रोलिंग का मतलब है और लागू करना डेटा की एक श्रृंखला की शुरुआत में

library(zoo) 
df= data.frame(a=c(1,2,3,4,5)) 
df$answer = rollapply(df$a, 4,mean) 
#help 

उदाहरण के लिए, पंक्ति 1 1 का मान होता है, पंक्ति 2 (1 + 2) /2=1.5 के एक मूल्य के लिए होता है, पंक्ति 3 से 6/3 = 2 का मान होता है।

मैं 4 अवधि के रोलिंग माध्यम करना चाहता हूं लेकिन कम महीनों के साथ अवधि में, मैं अधिकतम अवधि की अनुमति देना चाहता हूं।

+1

उपयोगी प्रश्न! –

उत्तर

7

उपयोग सही partial=TRUE साथ aligment , यानी rollapplyr(..., partial=TRUE) या rollapply(..., align = "right", partial=TRUE)। यहां हम rollapplyr का उपयोग करते हैं:

rollapplyr(df$a, 4, mean, partial = TRUE) 
+0

यही वह है जिसे मैं ढूंढ रहा था ... वह कार्य के भीतर सही झंडे को नहीं समझ सका। धन्यवाद और हर किसी के लिए धन्यवाद! – runningbirds

2

तुम भी पैकेज के बिना कोशिश कर सकते हैं:

sapply(seq_along(df$a), function(u) mean(df$a[max(u-3,0):u])) 
#[1] 1.0 1.5 2.0 2.5 3.5 

या एक vectorized समाधान - पाश बिना - आधार R:

with(df, (cumsum(a) - c(rep(0,4),head(a,-4)))/pmin(seq_along(a),4)) 
#[1] 1.0 1.5 2.0 2.5 3.5 
1

अतिरिक्त NAS जोड़ने के बारे में क्या?

rollapply(c(rep(NA, 3),df$a), 4, FUN = mean, align = "right", na.rm = TRUE) 
3

मुझे लगता है कि यह केवल इस तरह के निम्नलिखित (एक वैकल्पिक समाधान के रूप में) के रूप में एक साधारण समारोह के साथ किया जा सकता है:

rollapply2 <- function(myvec, width, fun){ 
    #the first values up to width 
    firstvalues <- cumsum(myvec[1:(width-1)])/(1:(width-1)) 
    #the rest of the values as normal 
    normalvalues <- rollapply(myvec, width, fun) 
    #return them all 
    c(firstvalues,normalvalues) 
} 

आउटपुट:

> rollapply2(df$a, 4, mean) 
[1] 1.0 1.5 2.0 2.5 3.5 
संबंधित मुद्दे