使用rollapplyr函数从xts对象构建多滑动窗口时遇报错,求解决
解决xts对象使用rollapplyr的报错问题
问题根源
xts对象自带时间索引,rollapplyr处理时会维护索引相关的维度元信息。直接用c函数处理窗口内的xts子集时,返回的元素结构和xts要求的维度命名不匹配,触发"length of 'dimnames' [1] not equal to array extent"错误。而普通矩阵无时间索引,c可以直接按预期展开窗口元素。
可行解决方案
方案1:自定义函数适配xts结构
用function(x) c(t(x))替代c,让窗口内的3行2列数据按行展开为1维向量,完美匹配原矩阵处理的输出逻辑,同时保留xts的时间索引:
library(xts) data <- matrix(1:20,ncol = 2, dimnames = list(NULL, c("var1","var2"))) data_xts <- xts(data, Sys.time()+1:10) rollapplyr(data_xts, 3, function(x) c(t(x)))
方案2:转矩阵后处理
如果不需要保留xts的时间索引,直接转成普通矩阵再执行原操作:
rollapplyr(as.matrix(data_xts), 3, c)
输出结果和原矩阵处理完全一致,但返回的是普通矩阵。
方案3:用as.vector配合by.column=FALSE
指定by.column=FALSE后,用as.vector展开窗口元素,同样能得到正确结果且返回xts对象:
rollapplyr(data_xts, 3, as.vector, by.column=FALSE)
验证输出
执行方案1后,输出示例如下(时间索引随实际生成时间变化):
[,1] [,2] [,3] [,4] [,5] [,6] 2024-05-20 16:05:03 1 2 3 11 12 13 2024-05-20 16:05:04 2 3 4 12 13 14 2024-05-20 16:05:05 3 4 5 13 14 15 2024-05-20 16:05:06 4 5 6 14 15 16 2024-05-20 16:05:07 5 6 7 15 16 17 2024-05-20 16:05:08 6 7 8 16 17 18 2024-05-20 16:05:09 7 8 9 17 18 19 2024-05-20 16:05:10 8 9 10 18 19 20
内容的提问来源于stack exchange,提问作者mr.T
相关产品推荐
相关产品推荐

