【问题标题】:Iterate over a list containing xts objects of unequal length遍历包含长度不等的 xts 对象的列表
【发布时间】:2013-10-22 20:21:17
【问题描述】:

我有一个包含以xts 格式存储的时间序列数据的列表。这些列表的长度不等,并且只有一部分日期/行相交。

我希望迭代具有各种功能的列表组合——例如,我希望找到差异。

我可以为每个组合执行此操作,但无法获得更高阶的函数来遍历批次。

因此,例如,以下每个工作:

combn(c(1,2), 2, function(X) exData[[X[1]]] - exData[[X[2]]])
combn(c(1,3), 2, function(X) exData[[X[1]]] - exData[[X[2]]])
combn(c(2,3), 2, function(X) exData[[X[1]]] - exData[[X[2]]])

但是,我对 高阶 函数的尝试失败了:

combn(1:length(exData), 2, function(X) exData[[X[1]]] - exData[[X[2]]])

相反,它返回错误:Error in combn(1:length(exData), 2, function(X) exData[[X[1]]] - exData[[X[2]]]) : number of items to replace is not a multiple of replacement length

我不确定这意味着什么......

一个示例数据集可以构造如下:

set.seed(1)
dtime <- seq(Sys.Date(), length.out = 20, by='day')
exData <- replicate(4, runif(sample(9:12, 1)), simplify=FALSE)
exData <- lapply(exData, 
                 function(x) xts(x, 
                                 order.by = sort(sample(dtime, 
                                                        length(x)))[1:length(x)]))

重点是并非所有日期都在列表中包含的每个xts 对象中,并且列表的长度不相等。在这一点上,我正在使用xts 对象规则来控制函数的应用——尽管以后可能会改变。

那么循环遍历每个组合的适当方式是什么?组合由下面的每一列给出:

combos <- combn(1:4, 2)
R> combos
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    1    1    2    2    3
[2,]    2    3    4    3    4    4

注意:在现实生活中,每个xts 都有多个列,并且需要允许应用于两个输入的函数的多样性。在@flodel 的帮助下,我制作了以下函数,这些函数在操作后保留了列名,并具有所需的灵活性。

funDiffName <- function(XTS, loc, ff){
# takes a list of XTS objects, a location pair (from combn), and the function to apply
# preserves names following the application of ff
    ffxy <- ff(XTS[[loc[1]]], XTS[[loc[2]]])
    names(ffxy) <- paste0(names(XTS[[1]]), "x", names(XTS[[2]]))
    ffxy
}

SecPx_diff <- combn(1:(length(SecPx_l)), 2,
                    function(X) funDiffName(SecPx_l, X, `-`),
                    simplify = FALSE)

【问题讨论】:

  • 您是否正在寻找具有相同时间戳的行的差异?
  • @geektrader 是的,我正在寻找具有相同时间戳的行之间的差异。

标签: r functional-programming xts lapply


【解决方案1】:

你需要先cbind他们。对于xtscbind 函数通过索引绑定两个 xts。

combn(1:length(exData), 2, function(X) {
        temp <- cbind(exData[[X[1]]], exData[[X[2]]])
        temp <- (temp[, 1] - temp[, 2])
        temp[!is.na(temp)]
    }, simplify = FALSE)

【讨论】:

    【解决方案2】:

    错误来自于 R 试图将结果放入数组中,但是这些片段的大小不同...解决方案是通过将 simplify = FALSE 添加到 combn 调用来请求列表。

    【讨论】:

      猜你喜欢
      • 2020-12-27
      • 1970-01-01
      • 2014-06-30
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 2022-10-04
      相关资源
      最近更新 更多