在xts上应用多列

时间:2018-01-26 08:14:09

标签: r apply xts

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

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有关但无法找到解决方案

1 个答案:

答案 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)
      })