2013-07-28 70 views

回答

3

您可以使用zoo::rollapply

require(zoo) 
x <- c(1, 2, 1, 3, 11, 7, 5) 
rollapply(x, width = 2, FUN = sum) 
## [1] 3 3 4 14 18 12 
0

爲了記錄在案,我問這個問題弄清楚如何註冊登錄數的矢量的變化,得益於@dickoa「的回答,我知道了這樣做的方法:

require(zoo) 
equals = function(x) all(diff(x) == 0) 
x = c(2, 3, -1, 3, -2, -5) 
y = sign(x) 
rollapply(y, 2, equals) 
[1] TRUE FALSE FALSE FALSE TRUE 
+2

'頭(Y,-1)==尾(Y,-1)'會無限快它總是值得(或接近)。在你的原始問題中陳述你的初始意圖。事實上,你應該編輯你的問題,而不是將其作爲答案。 – flodel

+0

對,對不起,我會照你下次說的去做。 – qed

7

在基礎R,有filter功能。它不如zoo::rollapply那樣友好和一般,但速度非常快。在你的情況,你正在尋找應用與權重c(1, 1)卷積濾鏡:

itersum <- function(x, n = 2) tail(filter(x, rep(1, n)), sides = 1), -(n-1)) 

itersum(x) 
# 3 3 4 14 18 12 

給你更多的想法,這裏是如何的diffcumsum功能可以重新寫在filter方面:

diff <- function(x) head(filter(x, c(1, -1)), -1) 
cumsum <- function(x) filter(x, 1, method = "recursive") 

一般來說,如果你正在尋找一個二元函數,然後headtail可能是最容易的d去,因爲它會利用矢量化功能最快的方法:

itersum  <- function(x) tail(x, -1) + head(x, -1) 
diff  <- function(x) tail(x, -1) - head(x, -1) 
sign.change <- function(x) tail(sign(x), -1) != head(sign(x), -1) 
+0

謝謝。你能解釋一下「濾波器係數」嗎?這看起來很難理解。 – qed

+0

另外,如果我想擁有每對連續產品,該怎麼辦? – qed

+0

我知道,這就是我的意思*不友善* ...看看卷積濾波器的文檔和公式。在你的情況下,你需要'y [i] = f [1] * x [i] + f [2] * x [i-1]'其中f [1]和f [2] '1'。所以'filter'參數需要是'c(1,1)'。看看'filter(x,c(1,1))'給出了什麼。然後,我使用的'tail'和'sides' arg只是一種處理你在尾巴上可能遇到的'NA'的方法。 – flodel