我试图弄清楚如何在从数据开始累积扩展的数据窗口上使用 R rollapply。
在时间 t,roll apply 应该使用 1:t 范围内的数据。在时间 t+1,它应该使用 1:t+1,以此类推。
非常感谢约翰
1) rollapplyr ( width
2nd arg) 可以是一个宽度向量,所以如果x
是某个输入向量并且f
是某个合适的函数,那么:
rollapplyr(x, seq_along(x), f)
例如,如果f
是,sum
则上述与 相同cumsum(x)
,如果f
是max
,则上述与 相同cummax(x)
。
Achim 指出这也有效:
rollapplyr(x, length(x), f, partial = TRUE)
2)Reduce以上可能是您想要的,但是,对于某些函数(它们必须接受两个参数并且迭代应用程序必须适合作为最终答案)我们可以Reduce
在 R 的基础上使用。例如,cumsum
对应cummmax
于:
Reduce(`+`, x, accumulate = TRUE)
Reduce(max, x, accumulate = TRUE)
请注意,这些不会给出累积平均值:
Reduce(mean, x, accumulate = TRUE) # BAD
Reduce(function(x, y) (x+y)/2, x, accumulate = TRUE) # BAD
虽然这确实给出了累积平均值:
Reduce(`+`, x, accumulate = TRUE) / seq_along(x) # ok
所以总而言之Reduce
,仅在某些受限情况下有效。
如果你需要mean
,你可以尝试(使用base R
函数)
cumsum(v1)/seq_along(v1)
#[1] 4.0 3.0 3.0 2.5 3.0
或者
sapply(seq_along(v1), function(i) mean(v1[1:i]))
#[1] 4.0 3.0 3.0 2.5 3.0
v1 <- c(4,2,3,1,5)