当函数通过数据进展时,如何使用rollapply
(或其他一些R函数)来增大窗口大小。换句话说,第一个应用适用于第一个元素,第二个适用于前两个元素,第三个适用于前三个元素等。
答案 0 :(得分:4)
如果您要申请min
,max
,sum
或prod
,这些功能的累积对应物已经是:
cummin
,cummax
,cumsum
和cumprod
要在不断增长/扩展的窗口中应用更多奇特的功能,您只需使用sapply
例如
# your vector of interest
x <- c(1,2,3,4,5)
sapply(seq_along(x), function(y,n) yourfunction(y[seq_len(n)]), y = x)
对于基本的动物园对象
x.Date <- as.Date("2003-02-01") + c(1, 3, 7, 9, 14) - 1
x <- zoo(rnorm(5), x.Date)
# cumsum etc will work and return a zoo object
cs.zoo <- cumsum(x)
# convert back to zoo for the `sapply` solution
# here `sum`
foo.zoo <- zoo(sapply(seq_along(x), function(n,y) sum(y[seq_len(n)]), y= x), index(x))
identical(cs.zoo, foo.zoo)
## [1] TRUE
答案 1 :(得分:2)
通过查看?zooapply
处的文档,我认为这可以做你想要的,其中a
是你的矩阵,sum
可以是任何函数:
a <- cbind(1:5,1:5)
# [,1] [,2]
# [1,] 1 1
# [2,] 2 2
# [3,] 3 3
# [4,] 4 4
# [5,] 5 5
rollapply(a,width=seq_len(nrow(a)),sum,align="right")
# [,1] [,2]
# [1,] 1 1
# [2,] 3 3
# [3,] 6 6
# [4,] 10 10
# [5,] 15 15
答案 2 :(得分:0)
除了@ mnel的回答:
对于更多奇特的功能,您可以简单地使用sapply
如果sapply
方法花费的时间太长,你可能最好迭代地制定你的函数。