R 合并大量xts对象

R 合并大量xts对象,r,list,merge,xts,zoo,R,List,Merge,Xts,Zoo,我有一个相互排斥的xts对象列表。我想将列表合并成一个大的xts对象。我这样做的目的是" merged\u reg\u 1\u min\u prices以下是如何有效地做到这一点:将每个xts对象转换为data.frame并简单地rbind它们。这几乎不会提高内存使用率。如果必要,只需从数据创建一个新的xts对象。frame我使用策略prov在…的帮助下 我已经将它转换为我包中的。此代码也是中的核心 do.call.rbind显然以速度取胜。您不想使用merge,因为这将返回一个6000列对象,

我有一个相互排斥的
xts
对象列表。我想将列表合并成一个大的
xts
对象。我这样做的目的是"


merged\u reg\u 1\u min\u prices以下是如何有效地做到这一点:将每个
xts
对象转换为
data.frame
并简单地
rbind
它们。这几乎不会提高内存使用率。如果必要,只需从
数据创建一个新的
xts
对象。frame
我使用策略prov在…的帮助下

我已经将它转换为我包中的。此代码也是中的核心


do.call.rbind
显然以速度取胜。

您不想使用
merge
,因为这将返回一个6000列对象,每个列表元素中的每行都有一行(在我的示例中为2880000)。并且大多数值将是
NA
cbind.xts
只需调用
merge.xts
,并使用一些默认参数值,因此您也不想使用它

我们知道通过
do.call
调用
rbind.xts
会导致内存问题。Jeff确实有更高效的代码,但它是一个不公开的原型

另一种选择是使用
Reduce
。这需要一段时间才能在我的笔记本电脑上运行,但即使只有4GB,内存也不是问题

library(xts)
l <- lapply(Sys.Date()-6000:1, function(x) {
  N=60*8;xts(rnorm(N),as.POSIXct(x)-seq(N*60,1,-60))})
x <- Reduce(rbind, l)
库(xts)

l是一个包含6000个xts对象的列表,其中每个列表元素都是一天一分钟的数据?是的。抱歉,让我在问题中补充一下,您确定要
cbind
而不是
rbind
?如果您想
rbind
数据,可以帮助我尝试
merge
rbind
de>cbind
。不幸的是,所有这些函数都失败了,内存使用量从原来的4千兆增加到了大约60千兆。我上面提到的函数用于
金融工具:::getSymbols.FI
,它可以很好地加载和合并很多天的高频数据。我认为
do.call.rbind
也不会占用太多内存,而且它很简单我测试过的数据的速度快了很多(甚至不包括转换回
xts
的时间).好的,酷,让我试一试。你知道正常的rbind是什么把事情搞砸了吗?不知道,但我打赌@JoshuaUlrich知道。如果我没记错的话,Jeff有一些未提交的代码来更有效地完成这项工作。太好了!什么是Reduce?我似乎找不到R refit@Alex:它是基本包中的函数。请参阅解释为什么
cbind
不是OP想要的。
do.call.rbind <- 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(rbind(lst[[i]], lst[[i+1]]))
    })
  }
  lst[[1]]
}
library(xts)
l <- lapply(Sys.Date()-6000:1, function(x) {
    N=60*8;xts(rnorm(N),as.POSIXct(x)-seq(N*60,1,-60))})
GS <- do.call.rbind
JU <- function(x) Reduce(rbind, x)
Alex <- function(x) do.call(rbind, lapply(x, as.data.frame)) #returns data.frame, not xts

identical(GS(l), JU(l)) #TRUE

library(rbenchmark)
benchmark(GS(l), JU(l), Alex(l), replications=1)
     test replications elapsed relative user.self sys.self user.child sys.child
3 Alex(l)            1  89.575 109.9080    56.584   33.044          0         0
1   GS(l)            1   0.815   1.0000     0.599    0.216          0         0
2   JU(l)            1 209.783 257.4025   143.353   66.555          0         0
library(xts)
l <- lapply(Sys.Date()-6000:1, function(x) {
  N=60*8;xts(rnorm(N),as.POSIXct(x)-seq(N*60,1,-60))})
x <- Reduce(rbind, l)