如何计算向量中每个元素的另一个向量中较小的元素的分数?

NJm*_*key 2 optimization performance loops r

n<-100000   
aa<-rnorm(n)
bb<-rnorm(n)
system.time(lapply(aa, function(z){mean(bb<pnorm(z))}))
Run Code Online (Sandbox Code Playgroud)

运行这个小代码需要很长时间.简单地说,我有两个向量aabb.对于每个元素aa,比方说aa[i],我想要的比例bb < aa[i]

我找到了这篇文章并尝试用它来加速.但它不起作用. sapply与复合函数的速度比较

任何帮助将不胜感激!

And*_*ndy 7

您可以使用该findInterval功能:

n <- 25000
aa <- rnorm(n)
bb <- rnorm(n)
system.time(q1 <- lapply(aa, function(z){mean(bb<pnorm(z))}))
#   user  system elapsed
# 20.057   2.544  22.807
system.time(q2 <- findInterval(pnorm(aa), sort(bb))/n)
#   user  system elapsed
#  0.020   0.000   0.021
all.equal(as.vector(q1, "numeric"), q2)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

请注意findInterval返回索引,所以我将结果除以n.如果你可以pnorm(aa)在给它之前进行排序findInterval,它会更快.

  • @Ian什么让我想起了http://unknownr.r-forge.r-project.org/.从作者的描述:"你知道有多少功能,也有在基础R他们中有多少你知道你不知道运行`UNK()`发现你未知的未知它的快速和它的乐趣?!" (3认同)