【问题标题】:Find the first n elements of one vector which contain all the elements of another vector找到一个向量的前 n 个元素,其中包含另一个向量的所有元素
【发布时间】:2021-08-03 15:34:32
【问题描述】:

给定两个向量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
  } 
}

但是有更快/更优雅的方法吗?

您可以使用一件事:vecB 始终是1:M 形式的序列。

这是一个n 应该等于 5 的示例:

vecB <- 1:3
vecA <- c(1, 2, 2, 1, 3, 2)

【问题讨论】:

    标签: r vector subset


    【解决方案1】:

    一个选项可能是:

    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 不匹配,我们将得到NA。正确的。如果所有vecB 匹配,则作为任何元素的(第一个)匹配的最后一个元素是所有匹配的第一个元素。
    • 您的解释是正确的 :) 我仍在考虑边缘情况,当它不起作用时。
    • 它现在在我的包裹里,所以如果你找到了,最好告诉我:-)
    【解决方案2】:

    一个解决方案(虽然)但逻辑翻译可能是

    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 创建

    【讨论】:

    • 这在 purrr 中可以短得多
    猜你喜欢
    • 2019-05-10
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多