我有~5个非常大的向量(~108个MM条目)所以我在R中用它们做的任何情节/东西需要相当长的时间。
我正在尝试将它们的分布(直方图)可视化,并且想知道在不花费太长时间的情况下将它们的直方图分布叠加在R中的最佳方法是什么。我想首先在直方图上拟合一个分布,然后在一个图中将所有分布线拟合在一起。
你对如何做到有什么建议吗?
让我们说我的载体是:
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条目的数据框,然后绘制,在我的情况下非常低效。
谢谢!
答案 0 :(得分:20)
这里有一小段Rcpp可以非常有效地存储数据 - 在我的计算机上需要大约一秒钟就可以获得100,000,000次观察:
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中的默认值:)