2013-02-14 55 views
1

下面給出的這一行將簡單地計算某些值的移動平均值,窗口爲3.由於值的總數是12,移動平均寡婦是3,因此結果值的數量是10(如下所示) 。如何從相應的原始值中減去移動平均結果?

library(zoo) 
x <- c(1,2,3,NA,NA,4,6,5,6,4,2,5) 
movingmean <- rollapply(x, 3, FUN = mean, na.rm = T) 
movingmean 
# [1] 2.000000 2.500000 3.000000 4.000000 5.000000 5.000000 
# [7] 5.666667 5.000000 4.000000 3.666667 

欲減去對應的原始值這些平均值(movingmean)。

例如:2-2.000000, 3-2.500000, NA-3.000000, NA-4.000000, ..., 2-3.666667

+0

'的x movingmean'應該這樣做 – Andrie 2013-02-14 15:52:03

+0

'×〔seq_along(movingmean)] - movingmean' – Arun 2013-02-14 15:52:33

+1

動物園對它們執行時算術所以自動對齊動物園對象:'ž< - 動物園(X); rollapply(z,3,mean,na.rm = TRUE) - z'會這樣做。 – 2013-02-14 21:07:53

回答

3

默認情況下,rollapply不墊NA的結果。設置fill=NA這樣做。

movingmean <- rollapply(x, 3, FUN=mean, na.rm=TRUE, fill=NA) 
x - movingmean 
# [1]   NA 0.0000000 0.5000000   NA   NA 
# [6] -1.0000000 1.0000000 -0.6666667 1.0000000 0.0000000 
# [11] -1.6666667   NA 

還要注意的是rollapply默認使用一個居中的窗口。您可以通過align參數更改它,或者如果您想要右對齊計算(與大多數時間序列一樣),請使用rollapplyr

1

您可以更改平均功能:

library(zoo) 
x <- c(1,2,3,NA,NA,4,6,5,6,4,2,5) 
> rollapply(x, 3, FUN = function(x) (x-mean(x))[2]) 
+0

@Barry我現在糾正它。 – agstudy 2013-02-14 16:03:30

+0

@agstudy,我認爲它是'(x-mean(x))[2])' – Arun 2013-02-14 16:04:32

+0

@你說得對。我更新答案。 – agstudy 2013-02-14 16:08:57

1

這個怎麼樣?

x[seq_along(movingmean)+1] - movingmean 

# [1] 0.0000000 0.5000000   NA   NA -1.0000000 1.0000000 
#  -0.6666667 1.0000000 0.0000000 -1.6666667