有没有办法让 rollapply 始终将矩阵传递给我的函数?
Is there a way to make rollapply always pass a matrix to my function?
有没有办法让 rollapply 总是向我的函数传递一个矩阵?或者当它没有将矩阵传递给我的函数时有什么好的处理方法?
假设我有以下内容:
library(zoo)
v <- read.zoo(data.frame(dt=as.Date('2011-01-01')+0:9, a=1:10, b=11:20, c=21:30), index.column = "dt")
v
a b c
2011-01-01 1 11 21
2011-01-02 2 12 22
2011-01-03 3 13 23
2011-01-04 4 14 24
2011-01-05 5 15 25
2011-01-06 6 16 26
2011-01-07 7 17 27
2011-01-08 8 18 28
2011-01-09 9 19 29
2011-01-10 10 20 30
假设我想 运行 滚动应用:
rollapplyr(v, seq_along(index(v)), by.column = F, FUN = function(x) { sum(x['a'] * x['b']) })
我得到以下结果:
2011-01-01 2011-01-02 2011-01-03 2011-01-04 2011-01-05 2011-01-06 2011-01-07 2011-01-08 2011-01-09 2011-01-10
11 NA NA NA NA NA NA NA NA NA
为什么会有NA?我认为正在发生的事情是第一次迭代使用向量,其余迭代使用矩阵。有没有办法让它总是在矩阵上滚动?或者处理 rollapply 返回的不同类型的最佳方法是什么?
我想获得像这样的累积产品:
cumprod
2011-01-01 1 * 11 = 11 (vector in function)
2011-01-02 1 * 11 + 2 * 12 = 35 (matrix in function)
2011-01-03 1 * 11 + 2 * 12 + 3 * 13 = 74 (matrix in function)
...
我总是最终使用如下结构来解决这些类型的问题,但只是想知道这是否正确,因为将向量转换为矩阵听起来很乱(只是想知道是否有更好的方法来处理这个问题):
rollapplyr(v, seq_along(index(v)), by.column = F, FUN = function(x) {
if (is.vector(x))
x = matrix(x, nrow=1, ncol=length(x), dimnames = list(NULL, names(x)))
sum(x[,'a'] * x[,'b'])
})
NOTE: I am not interested in cumprod - this is just an example
problem.
其中任何一个都将提供问题中显示的累计总和。请注意,在最后一个中,by.column=FALSE
导致所有列一次传递,coredata=FALSE
导致它作为动物园对象传递。
cumsum(v$a * v$b)
rollapplyr(v$a * v$b, 1:nrow(v), sum)
rollapplyr(v, 1:nrow(v), function(x) sum(x$a * x$b),
by.column = FALSE, coredata = FALSE)
有没有办法让 rollapply 总是向我的函数传递一个矩阵?或者当它没有将矩阵传递给我的函数时有什么好的处理方法?
假设我有以下内容:
library(zoo)
v <- read.zoo(data.frame(dt=as.Date('2011-01-01')+0:9, a=1:10, b=11:20, c=21:30), index.column = "dt")
v
a b c
2011-01-01 1 11 21
2011-01-02 2 12 22
2011-01-03 3 13 23
2011-01-04 4 14 24
2011-01-05 5 15 25
2011-01-06 6 16 26
2011-01-07 7 17 27
2011-01-08 8 18 28
2011-01-09 9 19 29
2011-01-10 10 20 30
假设我想 运行 滚动应用:
rollapplyr(v, seq_along(index(v)), by.column = F, FUN = function(x) { sum(x['a'] * x['b']) })
我得到以下结果:
2011-01-01 2011-01-02 2011-01-03 2011-01-04 2011-01-05 2011-01-06 2011-01-07 2011-01-08 2011-01-09 2011-01-10
11 NA NA NA NA NA NA NA NA NA
为什么会有NA?我认为正在发生的事情是第一次迭代使用向量,其余迭代使用矩阵。有没有办法让它总是在矩阵上滚动?或者处理 rollapply 返回的不同类型的最佳方法是什么?
我想获得像这样的累积产品:
cumprod
2011-01-01 1 * 11 = 11 (vector in function)
2011-01-02 1 * 11 + 2 * 12 = 35 (matrix in function)
2011-01-03 1 * 11 + 2 * 12 + 3 * 13 = 74 (matrix in function)
...
我总是最终使用如下结构来解决这些类型的问题,但只是想知道这是否正确,因为将向量转换为矩阵听起来很乱(只是想知道是否有更好的方法来处理这个问题):
rollapplyr(v, seq_along(index(v)), by.column = F, FUN = function(x) {
if (is.vector(x))
x = matrix(x, nrow=1, ncol=length(x), dimnames = list(NULL, names(x)))
sum(x[,'a'] * x[,'b'])
})
NOTE: I am not interested in cumprod - this is just an example problem.
其中任何一个都将提供问题中显示的累计总和。请注意,在最后一个中,by.column=FALSE
导致所有列一次传递,coredata=FALSE
导致它作为动物园对象传递。
cumsum(v$a * v$b)
rollapplyr(v$a * v$b, 1:nrow(v), sum)
rollapplyr(v, 1:nrow(v), function(x) sum(x$a * x$b),
by.column = FALSE, coredata = FALSE)