繁体   English   中英

R - 更快替代hist(XX,plot = FALSE)$ count

[英]R - faster alternative to hist(XX, plot=FALSE)$count

我正在寻找更快的替代R的hist(x, breaks=XXX, plot=FALSE)$count函数,因为我不需要生成任何其他输出(因为我想在sapply使用它)调用,需要100万次迭代,其中将调用此函数),例如

x = runif(100000000, 2.5, 2.6)
bincounts = hist(x, breaks=seq(0,3,length.out=100), plot=FALSE)$count

有什么想法吗?

使用tablecut第一次尝试:

table(cut(x, breaks=seq(0,3,length.out=100)))

它避免了额外的输出,但在我的电脑上大约需要34秒:

system.time(table(cut(x, breaks=seq(0,3,length.out=100))))
   user  system elapsed 
 34.148   0.532  34.696 

相比于hist 3.5秒:

system.time(hist(x, breaks=seq(0,3,length.out=100), plot=FALSE)$count)
   user  system elapsed 
  3.448   0.156   3.605

使用tabulate.bincode运行速度比快一点点hist

tabulate(.bincode(x, breaks=seq(0,3,length.out=100)), nbins=100)

system.time(tabulate(.bincode(x, breaks=seq(0,3,length.out=100))), nbins=100)
   user  system elapsed 
  3.084   0.024   3.107

使用tablulatefindInterval相对于tablecut提供了显着的性能提升,相对于hist有一个很好的改进:

tabulate(findInterval(x, vec=seq(0,3,length.out=100)), nbins=100)

system.time(tabulate(findInterval(x, vec=seq(0,3,length.out=100))), nbins=100)
   user  system elapsed 
  2.044   0.012   2.055

似乎最好的办法就是减少hist.default所有开销。

nB1 <- 99
delt <- 3/nB1
fuzz <- 1e-7 * c(-delt, rep.int(delt, nB1))
breaks <- seq(0, 3, by = delt) + fuzz

.Call(graphics:::C_BinCount, x, breaks, TRUE, TRUE)

我通过运行debugonce(hist.default)来减少这一点,以了解hist究竟是如何工作的(并使用较小的向量进行测试 - n = 100而不是1000000 )。

比较:

x = runif(100, 2.5, 2.6)
y1 <- .Call(graphics:::C_BinCount, x, breaks + fuzz, TRUE, TRUE)
y2 <- hist(x, breaks=seq(0,3,length.out=100), plot=FALSE)$count
identical(y1, y2)
# [1] TRUE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM