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)