【问题标题】:Why is rbindXts's dup parameter not exposed?为什么rbindXts的dup参数没有暴露?
【发布时间】:2015-09-26 05:21:52
【问题描述】:

我想rbind 一堆 xts 对象,应该不重叠,但如果它们重叠,我不希望它添加两次:从一个或另一个中选择. (我目前是duplicated(index(x)),然后删除它们。)

(显示问题和所需输出的示例代码如下)。

四处寻找,我发现C source 有一个dup 参数;它默认为FALSE,当我将其设置为TRUE 时,我得到了我想要的行为:

.External("rbindXts", dup = T, x,y,z, PACKAGE = "xts")

rbind() 界面中没有公开它是否有充分的理由? (所谓“好”的原因,我的意思是它被认为是错误的,或者在大数据上的性能非常差,或者类似的东西。)或者更实际的原因,比如没有人有时间编写测试和它的文档了吗?

更新: 我回到我的代码,发现我实际上并没有使用rbind.xts,而是使用这里描述的do.call.rbind() 函数:https://stackoverflow.com/a/9729804/841830 由于rbind.xts 中的内存问题。

(我还发现了三年前我自己的 (!) 问题,它描述了我如何删除重复项:How to remove a row from zoo/xts object, given a timestamp

更新 #2:

do.call.rbind 可以修改为使用External 调用:

do.call.rbind.xts.no_dup <- function(lst) {
  while(length(lst) > 1) {
    idxlst <- seq(from=1, to=length(lst), by=2)
    lst <- lapply(idxlst, function(i) {
      if(i==length(lst)) { return(lst[[i]]) }
      return(.External("rbindXts", dup = T, lst[[i]], lst[[i+1]], PACKAGE = "xts"))
    })
  }
  lst[[1]]
}

我使用此处显示的相同测试数据进行了测试:https://stackoverflow.com/a/12029366/841830,它具有与do.call.rbind 相同的性能,并生成相同的 280 万行 xts 对象(这很好)。当然,那个测试数据没有重复,所以可能不是一个公平的测试?


x <- xts(1:10, Sys.Date()+1:10)
y <- xts(50:55,Sys.Date() + (-1:-6))
z <- xts(20:25,Sys.Date() + (-2:+3))
rbind(x,y,z)

这给出了以下输出(带有 *** 显示不需要的行)

2015-07-02   55
2015-07-03   54
2015-07-04   53
2015-07-05   52
2015-07-06   51
2015-07-06   20   ***
2015-07-07   50
2015-07-07   21   ***
2015-07-08   22
2015-07-09    1
2015-07-09   23   ***
2015-07-10    2
2015-07-10   24   ***
2015-07-11    3
2015-07-11   25   ***
2015-07-12    4
2015-07-13    5
2015-07-14    6
2015-07-15    7
2015-07-16    8
2015-07-17    9
2015-07-18   10

.External("rbindXts", dup = T, x,y,z, PACKAGE = "xts") 给出:

2015-07-02   55
2015-07-03   54
2015-07-04   53
2015-07-05   52
2015-07-06   51
2015-07-07   50
2015-07-08   22
2015-07-09    1
2015-07-10    2
2015-07-11    3
2015-07-12    4
2015-07-13    5
2015-07-14    6
2015-07-15    7
2015-07-16    8
2015-07-17    9
2015-07-18   10

【问题讨论】:

  • 我对演示您在使用 rbind.xts 时遇到的内存问题的可重现示例非常感兴趣。
  • @JoshuaUlrich 在stackoverflow.com/a/12029366/841830 中使用测试数据并执行do.call(rbind.xts,l)。 (但不要这样做 - 我的机器在我之前尝试过它时变得非常无响应,以查看自 @GSee 的基准测试以来问题是否已得到解决。)
  • 谢谢。我想我有一个解决办法。该代码当前正在“递归”while循环中保护每个新对象,并且在循环完成之前它不会取消保护它们。这意味着所有中间对象都保存在内存中,无法用于垃圾收集......哎呀。

标签: r xts


【解决方案1】:

看着the commit where it was added,它似乎是实验性的。因此,出于实际原因,它没有被公开:它未经测试/未记录。

【讨论】:

  • 谢谢。我已经改用它了,到目前为止没有任何退步。今天晚些时候我会向它抛出更多数据(如果我的其他编码按计划进行),那么也许我可以提供一个补丁来公开它并记录它。
猜你喜欢
  • 2010-12-24
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
  • 2018-02-16
  • 2018-12-25
  • 2022-06-14
  • 2021-02-04
相关资源
最近更新 更多