我有一个奇怪的错误,我无法理解。让我解释变量及其含义:
ts <- a xts object
range.matrix <- matrix with two columns and n rows (only knows at execution time)
因此,range.matrix
包含日期范围。第一列是范围的开始,第二列是范围的结束。目标是按照range.matrix中的范围对ts时间序列进行切片,得到一个包含所有切片的列表。
它在某些范围内失败,但在另一些范围内失败,而在1行矩阵中失败.错误信息是:
数组中的错误(ans,c(len.a%/%d2,d.ans),if (!is.null(name(dn.ans))长度不等于数组范围)
用这个玩具示例检查自己(range.matrix
包含的数字是as.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
有关,但无法找到解决方案。
发布于 2018-01-26 08:45:42
试一试,你就不会有问题了:
lapply(split(range.matrix, row(range.matrix)), function(x) {
ts[paste0(as.Date(r[1]), '/', as.Date(r[2]))]})
就我个人而言,我不会以您想要的方式在xts
对象上使用xts
(我会这样做;lapply
要自然得多)。
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)
})
https://stackoverflow.com/questions/48457745
复制相似问题