The iterative and lagging function is similar to the difference in R, but not only the difference?

The diff function in R returns lagging and iterated differences, respectively.

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 4 -6 

Is there a way to customize this so that we can use functions other than differences? For example, sum:

 itersum(x) # 3 3 4 14 18 12 
+4
source share
3 answers

You can use 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 
+3
source

There is a filter function in the R database. It is not as friendly and generally as zoo::rollapply , but it is very fast. In your case, you want 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's how the diff and cumsum can be rewritten 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 want to drill a binary function, then head and tail are probably the easiest and fastest way, since it will use 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) 
+7
source

For the record, I asked this question to figure out how to register sign changes in a vector of numbers, thanks to @dickoa's answer, I did it like this:

 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 
0
source

Source: https://habr.com/ru/post/1493924/


All Articles