我有一个奇怪的错误,我无法理解。让我解释变量及其含义:
ts <- a xts object
range.matrix <- matrix with two columns and n rows (only knows at execution time)
所以,range.matrix
包含日期范围。第一列是范围的开头,第二列是它的结尾。目标是将ts时间序列按range.matrix中的范围切片a获取包含所有切片的列表。
它失败了一些范围但在其他范围内没有,并且失败了1行矩阵......错误信息是:
数组错误(ans,c(len.a%/%d2,d.ans),if(!is.null(names(dn.ans)) 'dimnames'1的长度不等于数组范围
使用此玩具示例检查自己(range.matrix
包含转换为.Date的数字)
library(xts)
ts <- xts(cbind('a'= c(1,2,3,4,5,6,7,8),'b' =c(1,2,3,4,5,6,7,8),'c'= c(1,2,3,4,5,6,7,8))
,order.by = as.Date(as.Date('2017-01-01'):(as.Date('2017-01-01')+7)) )
range.matrix <- matrix(c(16314,17286), ncol = 2,byrow = TRUE) # Fails. Range: "2014-09-01/2017-04-30"
range.matrix <- matrix(c(16314,17236,16314,17286), ncol = 2,byrow = TRUE) # Fails. Range: "2014-09-01/2017-03-11" and "2014-09-01/2017-04-30"
range.matrix <- matrix(c(16314,17236,17237,17286), ncol = 2,byrow = TRUE) # does not fail. "2014-09-01/2017-03-11" and "2017-03-12/2017-04-30"
apply(range.matrix,
1,
function(r) {
ts[paste0(as.Date(r[1]), '/', as.Date(r[2]))]
})
有任何线索吗?它与dimnames
有关但无法找到解决方案
答案 0 :(得分:4)
请尝试使用此功能,但您不会遇到问题:
lapply(split(range.matrix, row(range.matrix)), function(x) {
ts[paste0(as.Date(r[1]), '/', as.Date(r[2]))]})
就我个人而言,我不会以apply
对象的方式使用xts
(我执行上述操作; lapply
更自然)。< / p>
apply
用于数组,而xts对象不仅仅是一个矩阵(数组),而且还支持时间索引和其他赋予xts功能的属性。您可以在xts对象上使用类似coredata
的内容,只需将基础矩阵返回到apply
调用,然后您就不会收到错误,但结果不会太多感。
apply(range.matrix,
1,
function(r) {
res <- ts[paste0(as.Date(r[1]), '/', as.Date(r[2]))]
coredata(res)
})