2016-12-02 51 views
-1

這裏是一個示例df,我希望計算移動窗口上的累積和。在R中創建一個移動窗口cumsum

d <- data.frame(y = 1:10) 

從以前suggestions,我能夠進行滑動窗口cumsum,使用下面的腳本(感謝nograpes):

size <- 2 # size of window 
len <- nrow(d) - size +1 # number of sliding windows to perform 

sumsmatrix <- apply(d, 2, function(x)     
    cumsum(x)[size:nrow(d)] - c(0,cumsum(x)[1:(len-1)])) 

,並給出了下面的輸出:

y 
3 
5 
7 
9 
11 
13 
15 
17 
19 

我的要求是通過移動窗口而不是滑動來執行cumsum。比如把我的窗口大小爲2,我想計算列的前兩行的cumsum,然後移動到第3和計算第三和第四等..

所需的輸出:

y 
1 
3 
3 
7 
5 
11 
7 
15 
9 
19 

如何調整腳本以適合我的需求?

回答

1

我們可以通過操作通過創建%/%分組變量做一組,然後通過功能即tapply

unlist(tapply(d$y, (seq_len(nrow(d))-1)%/% size, FUN = cumsum), use.names = FALSE) 
#[1] 1 3 3 7 5 11 7 15 9 19 
1

另一種方法是創建一個組變量,並使用cumsum()該組使用。

library(dplyr) 

d %>% 
group_by(group = rep(1:(nrow(.)/2), each = 2)) %>% 
transmute(y = cumsum(y)) %>% 
ungroup %>% 
select(-group) 

#  y 
# <int> 
#1  1 
#2  3 
#3  3 
#4  7 
#5  5 
#6  11 
#7  7 
#8  15 
#9  9 
#10 19 
1

最初的例子似乎是在寬度爲2的窗口上滾動求和,而不是累加和。它可以更緊湊寫成:

library(zoo) 

rollapplyr(d, 2, sum) 

rollsum(d, 2) 

或這裏面不使用套餐:

apply(d, 2, function(x) rowSums(embed(x, 2))) 

現在得到了這裏的實際問題是一些替代方案:

1)動物園執行cumsum同時向前滾動以2:

apply(d, 2, function(x) t(rollapplyr(x, 2, cumsum, by = 2))) 

2)不包這也將工作和不使用套餐:

apply(d, 2, function(x) apply(matrix(x, 2), 2, cumsum)) 

修訂在其輸入的每一行工作。