首页 > 解决方案 > 有没有办法让 rollapply 总是将矩阵传递给我的函数?

问题描述

有没有办法让 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

假设我想运行一个 rollapply:

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'])
  })

注意:我对 cumprod 不感兴趣 - 这只是一个示例问题。

标签: rdataframezoo

解决方案


其中任何一个都将提供问题中显示的累积总和。请注意,在最后一个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) 

推荐阅读