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

qed*_*qed 5 r

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
Run Code Online (Sandbox Code Playgroud)

反正有没有定制这个,以便我们可以使用除差异之外的功能?例如,总和:

itersum(x)
# 3 3 4 14 18 12
Run Code Online (Sandbox Code Playgroud)

flo*_*del 8

在基数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
Run Code Online (Sandbox Code Playgroud)

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

diff   <- function(x) head(filter(x, c(1, -1)), -1)
cumsum <- function(x) filter(x, 1, method = "recursive")
Run Code Online (Sandbox Code Playgroud)

一般来说,如果你正在寻找推出一个二元函数,那么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)
Run Code Online (Sandbox Code Playgroud)


dic*_*koa 5

您可以使用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
Run Code Online (Sandbox Code Playgroud)