迭代和滞后函数类似于R中的diff,但不仅仅是diff



R中的diff函数返回适当滞后和迭代的差。

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

有没有什么可以定制的,这样我们就可以使用除差异之外的其他功能?例如,sum:

itersum(x)
# 3 3 4 14 18 12

在基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

为了给您更多的想法,以下是如何根据filter:重写diffcumsum函数

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

一般来说,如果您希望滚动一个二进制函数,那么headtail可能是最简单、最快的方法,因为它将利用矢量化函数:

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)

您可以使用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

为了记录在案,我问了这个问题来弄清楚如何在数字向量中注册符号变化,多亏了@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

相关内容

最新更新