11

xts相互に排他的な日であるオブジェクトのリストがあります。mergeリストを1つの大きなxtsオブジェクトにしたいと思います。これをしようとした私の試みは」

merged_reg_1_min_prices <- do.call(cbind, reg_1_min_prices)

ただし、これはメモリが不足しているようです。 reg_1_min_prices相互に排他的な日に 1 分のリターンが 6,000 日あるので、それほど大きくはありません。これを回避する方法を知っている人はいますか?

明確にするために、reg_1_min_prices相互に排他的な日が含まれており、各日は 1 分価格であり、リスト内の各エントリはxtsオブジェクトです。

4

3 に答える 3

12

この質問の回答でドミニクが提供した戦略を使用します

私はそれを私のqmaoパッケージの関数に変えました。このコードは、FinancialInstrument パッケージのgetSymbols.FIの中核でもあります。

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]]
}

必要に応じてrbind data.frames@ JoshuaUlrichがこちらでエレガントなソリューションを提供しています


私が知る限り、(よく見なくても) メモリは、提供されている 3 つのソリューション ( @JoshuaUlrich@Alex、および qmao::do.call.rbind ) のいずれにも問題はありません。だから、それはスピードに帰着します...

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

do.call.rbind明らかにスピードで勝っています。

于 2012-08-19T19:34:38.860 に答える
10

merge各リスト要素の各行に 1 つの行を含む 6000 列のオブジェクトが返されるため、使用したくありません(私の例では 2,880,000)。そして、ほとんどの値は になりますNAcbind.xtsいくつかのデフォルトの引数値で呼び出すだけmerge.xtsなので、それも使用したくないでしょう。

rbind.xtsviaを呼び出すことによって引き起こされるメモリの問題を認識していますdo.call。Jeff はより効率的なコードを持っていますが、それは公開されていないプロトタイプです。

@GSeeのソリューションの代替は、を使用すること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)
于 2012-08-19T20:18:26.800 に答える
1

これを効率的に行う方法は次のとおりです。各xtsオブジェクトを に変換しdata.frame、単純rbindにします。これにより、メモリ使用量はほとんど増加しません。必要に応じて、から新しいxtsオブジェクトを作成するだけです。data.frame

于 2012-08-19T18:42:50.773 に答える