查找一个向量的前 n 个元素,其中包含另一个向量的所有元素

Find the first n elements of one vector which contain all the elements of another vector

给定两个向量 vecAvecB,我想找到最小的 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 创建