如果速度是这里的一个重要因素(并且,阅读原始帖子,它似乎可能是),那么使用 Rcpp 的自定义解决方案可能比迄今为止发布的任何纯 R 方法都更快:
library(Rcpp)
find.second = cppFunction(
"int findSecond(NumericVector x, const int value) {
bool startFirst = false;
bool inFirst = false;
for (int i=0; i < x.size(); ++i) {
if (x[i] == value) {
if (!startFirst) {
startFirst = true;
inFirst = true;
} else if (!inFirst) {
return i+1;
}
} else {
inFirst = false;
}
}
return -1;
}")
这里是@AnandMahto 的基准,扩展到包括find.second:
set.seed(1)
a <- sample(25, 1e7, replace = TRUE)
findFirst(a, 10, 2)
# [1] 14
find.index(a, 10)
# [1] 14
op(a, 10)
# [1] 14
find.second(a, 10)
# [1] 14
microbenchmark(findFirst(a, 10, 2), find.index(a, 10), op(a, 10), find.second(a, 10), times = 5)
# Unit: milliseconds
# expr min lq median uq max neval
# findFirst(a, 10, 2) 79.00000 93.85400 96.80120 118.32011 121.56636 5
# find.index(a, 10) 1620.83892 1673.72124 1689.06826 1747.42781 2145.90346 5
# op(a, 10) 78.54637 83.71081 94.20531 97.30813 195.78469 5
# find.second(a, 10) 14.57835 24.36220 25.24104 36.57584 47.45959 5