The diff function in R returns suitably lagged and iterated differences.
x = c(1, 2, 1, 3, 11, 7, 5)
diff(x)
# [1] 1 -1 2 8 -4 -2
diff(x, lag=2)
[1] 0 1 10
In base R, there is the filter
function. It is not as friendly and general as zoo::rollapply
but it is extremely fast. In your case, you are looking to apply a convolution filter with weights 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
To give you more ideas, here is how the diff
and cumsum
functions can be re-written in terms of filter
:
diff <- function(x) head(filter(x, c(1, -1)), -1)
cumsum <- function(x) filter(x, 1, method = "recursive")
In general, if you are looking to roll a binary function, then head
and tail
is probably the easiest and fastest way to go as it will take advantage of vectorized functions:
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)