首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多列在xts上应用

多列在xts上应用
EN

Stack Overflow用户
提问于 2018-01-26 08:14:09
回答 1查看 1.1K关注 0票数 3

我有一个奇怪的错误,我无法理解。让我解释变量及其含义:

代码语言:javascript
运行
复制
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)

代码语言:javascript
运行
复制
    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有关,但无法找到解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-26 08:45:42

试一试,你就不会有问题了:

代码语言:javascript
运行
复制
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调用,这样就不会得到错误,但是结果没有多大意义。

代码语言:javascript
运行
复制
apply(range.matrix,
      1,
      function(r) {
        res <- ts[paste0(as.Date(r[1]), '/', as.Date(r[2]))]
        coredata(res)
      })
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48457745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档