r - 有没有办法让 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 不感兴趣 - 这只是一个示例问题。
解决方案
其中任何一个都将提供问题中显示的累积总和。请注意,在最后一个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)
推荐阅读
- android - 无法为 com.android.build.gradle.internal.dsl.NdkOptions 类型的对象获取未知属性“armeabi”
- python-2.7 - if 语句中的搜索字符串仅匹配部分项目
- c# - 如何使用 ASP.NET Core 从 DbContext 中的 JWT 获取用户名?
- typescript - 从另一个类型中删除一个类型的属性
- actions-on-google - Dialogflow JSON V2 的丰富消息
- python - Pandas Dataframe 到特定格式的字典列表
- c++ - c++ dllimport:函数调用返回错误结果
- arrays - 如何将可变长度数组常量作为参数传递?
- react-native - 未找到 React Native ios 'GoogleMaps/GoogleMaps.h' 文件
- google-sheets - 将脚本分配给 Google 文档中的按钮