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这可能是最快的@格雷戈找到了一个更快的
哪个(bfindInterval
在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