查找一个向量的前 n 个元素,其中包含另一个向量的所有元素
Find the first n elements of one vector which contain all the elements of another vector
给定两个向量 vecA
和 vecB
,我想找到最小的 n
使得
all(vecB %in% vecA[1:n])
是TRUE
.
这是一个紧密的内部循环,所以速度会很好。显然我可以做到
n <- NA_integer_
for (i in seq_along(vecA)) {
if (all(vecB %in% vecA[1:i])) {
n <- i
break
}
}
但是有faster/more优雅的方法吗?
您可以使用的一件事:vecB
始终是 1:M
.
形式的序列
这是一个 n
应等于 5 的示例:
vecB <- 1:3
vecA <- c(1, 2, 2, 1, 3, 2)
一个选项可以是:
max(match(vecB, vecA))
不同情况下的结果:
vecB <- 1:3
vecA <- c(1, 2, 2, 1, 3, 2)
[1] 5
vecB <- 1:3
vecA <- c(3, 2, 2, 1)
[1] 4
vecB <- 1:3
vecA <- c(2, 2, 1)
[1] NA
一个解决方案(虽然)但合乎逻辑的翻译可能是
vecB <- 1:3
vecA <- c(1, 2, 2, 1, 3, 2)
min(seq_along(vecA)[sapply(Reduce(function (.x, .y) union(.x, .y), vecA, accumulate = T),
function(x) all(vecB %in% x))])
#> [1] 5
由 reprex package (v2.0.0)
于 2021-05-13 创建
给定两个向量 vecA
和 vecB
,我想找到最小的 n
使得
all(vecB %in% vecA[1:n])
是TRUE
.
这是一个紧密的内部循环,所以速度会很好。显然我可以做到
n <- NA_integer_
for (i in seq_along(vecA)) {
if (all(vecB %in% vecA[1:i])) {
n <- i
break
}
}
但是有faster/more优雅的方法吗?
您可以使用的一件事:vecB
始终是 1:M
.
这是一个 n
应等于 5 的示例:
vecB <- 1:3
vecA <- c(1, 2, 2, 1, 3, 2)
一个选项可以是:
max(match(vecB, vecA))
不同情况下的结果:
vecB <- 1:3
vecA <- c(1, 2, 2, 1, 3, 2)
[1] 5
vecB <- 1:3
vecA <- c(3, 2, 2, 1)
[1] 4
vecB <- 1:3
vecA <- c(2, 2, 1)
[1] NA
一个解决方案(虽然)但合乎逻辑的翻译可能是
vecB <- 1:3
vecA <- c(1, 2, 2, 1, 3, 2)
min(seq_along(vecA)[sapply(Reduce(function (.x, .y) union(.x, .y), vecA, accumulate = T),
function(x) all(vecB %in% x))])
#> [1] 5
由 reprex package (v2.0.0)
于 2021-05-13 创建