3

私は〜5つの非常に大きなベクトル(〜108 MMエントリ)を持っているので、Rでそれらを使って行うプロット/ものにはかなり時間がかかります。

私はそれらの分布 (ヒストグラム) を視覚化しようとしていますが、あまり時間をかけずに R でヒストグラム分布を重ね合わせる最良の方法は何かと考えていました。最初に分布をヒストグラムに当てはめ、次にすべての分布線が 1 つのプロットに収まるようにプロットすることを考えています。

それを行う方法についていくつか提案はありますか?

私のベクトルは次のとおりです。

x1, x2, x3, x4, x5.

私はこのコードを使用しようとしています: Overlaying histograms with ggplot2 in R

3 つのベクトルに使用しているコードの例 (R はプロットに失敗します):

n = length(x1)
dat <- data.frame(xx = c(x1, x2, x3),yy = rep(letters[1:3],each = n))
ggplot(dat,aes(x=xx)) + 
    geom_histogram(data=subset(dat,yy == 'a'),fill = "red", alpha = 0.2) +
    geom_histogram(data=subset(dat,yy == 'b'),fill = "blue", alpha = 0.2) +
    geom_histogram(data=subset(dat,yy == 'c'),fill = "green", alpha = 0.2)

しかし、プロットを作成するには永遠に時間がかかり、最終的にはRから追い出されます.ggplot2を大きなベクトルに効率的に使用する方法についてのアイデアはありますか? 私の場合、5 * 108MMエントリのデータフレームを作成してからプロットする必要があったようですが、私の場合は非常に非効率的です。

ありがとう!

4

1 に答える 1

20

これは、データを非常に効率的にビン化する Rcpp の小さなスニペットです。私のコンピューターでは、1 億の観測値をビン化するのに約 1 秒かかります。

library(Rcpp)
cppFunction('
  std::vector<int> bin3(NumericVector x, double width, double origin = 0) {
    int bin, nmissing = 0;
    std::vector<int> out;

    NumericVector::iterator x_it = x.begin(), x_end;
    for(; x_it != x.end(); ++x_it) {
      double val = *x_it;
      if (ISNAN(val)) {
        ++nmissing;
      } else {
        bin = (val - origin) / width;
        if (bin < 0) continue;

        // Make sure there\'s enough space
        if (bin >= out.size()) {
          out.resize(bin + 1);
        }
        ++out[bin];
      }
    }

    // Put missing values in the last position
    out.push_back(nmissing);
    return out;
  }
')

x8 <- runif(1e8)
system.time(bin3(x8, 1/100))
#   user  system elapsed 
#  1.373   0.000   1.373 

とはいえ、histここでもかなり高速です。

system.time(hist(x8, breaks = 100, plot = F))
#   user  system elapsed 
#  7.281   1.362   8.669 

bin3ヒストグラムまたは頻度ポリゴンを作成するために使用するのは簡単です:

# First we create some sample data, and bin each column

library(reshape2)
library(ggplot2)

df <- as.data.frame(replicate(5, runif(1e6)))
bins <- vapply(df, bin3, 1/100, FUN.VALUE = integer(100 + 1))

# Next we match up the bins with the breaks
binsdf <- data.frame(
  breaks = c(seq(0, 1, length = 100), NA),
  bins)

# Then melt and plot
binsm <- subset(melt(binsdf, id = "breaks"), !is.na(breaks))
qplot(breaks, value, data = binsm, geom = "line", colour = variable)

参考までに、手元にあった理由はbin3、ggplot2 でこの速度をデフォルトにする方法に取り組んでいるためです:)

于 2012-12-01T16:14:34.097 に答える