R 第一不等式的快速检验

R 第一不等式的快速检验,r,performance,R,Performance,我正在寻找一个类似于match的函数,但它应该有一个不等式作为测试,并在第一次出现时停止 a <- c(1,3,5,7,9,12) b <- 6 # the output should be 4 # i tried this one: match(min(a [b <= a ]),a ), but with much data it is slow a这可能是最快的@格雷戈找到了一个更快的 哪个(bfindInterval在a中给出b的索引,或者如果不匹配,则给出a中最大值

我正在寻找一个类似于
match
的函数,但它应该有一个不等式作为测试,并在第一次出现时停止

a <- c(1,3,5,7,9,12)
b <- 6
# the output should be 4
# i tried this one:  match(min(a [b <= a ]),a ), but with much data it is slow
a这可能是最快的@格雷戈找到了一个更快的


哪个(b
findInterval
a
中给出
b
的索引,或者如果不匹配,则给出
a
中最大值的索引小于
b
;因此,使用
findInterval
,如果不完全匹配,则添加1,因为您需要下一个而不是上一个索引。
a
必须按顺序排序。)升序

ix <- findInterval(b, a, all.inside = TRUE)
ix <- ix + (a[ix] < b)

ix
## [1] 4

ix如果有较大的向量,那么仍然可以使用
match
match(TRUE,b1),停止应该在开始时发生,如:

a <- c(1,3,5,7,9,12, 100:1e6)
b <- 6

a是
min(其中(a>=b))
同样慢?你必须用编译语言编写代码,或者找到一个已经这样做的包。到目前为止,所有答案都是错误的,因为它们不会在第一次出现时停止。但是给出了不同的结果。它给出了4,这是必需的结果。如果你指的是最后一行,那么我认为你没有正确阅读。啊,好的,我指的是我使用了扩展的基准向量。刚刚更新了基准,到目前为止,你的代码赢了:)谢谢,我会删除我的,这样我们就不会有两个基准浮动了。“
Position
将只计算条件,直到它遇到第一个真值并立即返回相应的索引,而不继续遍历向量的其余部分。”-伟大的find+1,所以实际上问题是重复的。
Unit: milliseconds
                    expr       min        lq      mean    median        uq       max neval cld
match(min(a[b <= a]), a) 14.273060 14.770065 27.228264 26.043620 29.675095 273.45221   100   b
      min(which(a >= b))  9.537230  9.781012 13.306348 10.207344 10.445258  27.28422   100  a
        which(b <= a)[1]  8.192664  8.475993 14.774976  8.869157 19.935542 267.22919   100  a
     match(TRUE, b <= a)  6.045952  6.274809  9.125632  6.404545  6.845165  24.42210   100  a
ix <- findInterval(b, a, all.inside = TRUE)
ix <- ix + (a[ix] < b)

ix
## [1] 4
a <- c(1,3,5,7,9,12, 100:1e6)
b <- 6
v1 <- function() match(min(a[b <= a ]), a)
v2 <- function() min(which(a >= b))
v3 <- function() which(b <= a)[1]
v4 <- function() match(TRUE, b <= a)
v5 <- function() Position(function(x) b <= x, a)

microbenchmark::microbenchmark(
 v1(), v2(), v3(), v4(), v5()
)
# Unit: microseconds
# expr     min       lq      mean   median       uq      max neval cld
# v1() 10109.4 13822.10 23205.556 23481.95 26661.30 152809.4   100   c
# v2()  5796.8  6475.75 10404.439  6839.30 16991.90  34333.7   100  b 
# v3()  5144.8  5648.75  9381.664  5963.05  6801.25 142202.0   100  b 
# v4()  3963.0  4497.35  6938.296  4799.55  5419.80  22011.4   100  b 
# v5()     4.3    14.20    35.509    16.85    18.45   1858.8   100 a 
a <- c(1,3,5,7,9,12)
b <- 6
microbenchmark::microbenchmark(
  v1(), v2(), v3(), v4(), v5()
)
# Unit: nanoseconds
# expr  min   lq mean median   uq   max neval cld
# v1()  800  900 1151   1000 1100 12600   100  b 
# v2()  900 1000 1105   1000 1100  5600   100  b 
# v3()  800  900  953    900 1000  2700   100  b 
# v4()  400  500  584    600  600  1500   100 a  
# v5() 3600 3700 3983   3800 3900 10600   100   c