【问题标题】:Is there an R function finding a vector within another vector?是否有一个 R 函数在另一个向量中找到一个向量?
【发布时间】:2021-12-06 03:26:09
【问题描述】:

例如,我有两个向量:

x1 <- c(0,1,2)
x2 <- c(1,2,0,1,2,3,4,5,0,1,0,1,2)

我想找到 x1 第一次出现 x2 的位置,在本例中为 3。 我试过which()match(),但似乎都找到了元素,而不是向量。是否有可以实现此功能的 R 函数或构造方法?

谢谢!

【问题讨论】:

  • 你在找match(x1[1],x2)

标签: r vector position match


【解决方案1】:

一种选择是进行滚动比较。

x1 <- c(0,1,2) 
x2 <- c(1,2,0,1,2,3,4,5,0,1,0,1,2)

which(zoo::rollapply(x2, length(x1), function(x) all(x == x1)))
#[1]  3 11

获得第一次出现 -

which(zoo::rollapply(x2, length(x1), function(x) all(x == x1)))[1]
#[1] 3

【讨论】:

  • 非常感谢!!这也很有帮助!
【解决方案2】:

对于向量 x1 的所有元素。

sapply(x1, function(x) match(x,x2))
[1] 3 1 2

【讨论】:

    【解决方案3】:

    如果您正在寻找0 的第一个匹配项:

    match(x1[1], x2)
    

    但是对于整个向量:

    > which(apply(t(embed(x2, length(x1))) == rev(x1), 2, all))[1]
    [1] 3
    > 
    

    编辑:

    在不匹配时给NA

    cond <- apply(t(embed(x2, length(x1))) == rev(x1), 2, all)
    if (any(cond)) which(cond)[1] else NA
    

    解释:

    这使用embedx2拆分为x1长度的块,并应用它并检测它是否等效于x1,并给出一个布尔向量(或TRUEs和FALSEs)。最后它使用which获取TRUE出现的索引,我使用[1]获取第一个值。

    对于编辑,我检测条件布尔向量中是否包含任何TRUEs,如果是,则执行上述相同操作,如果不是,则提供NA

    【讨论】:

    • 非常感谢!这很有帮助。我正在寻找整个向量。后续问题:如果 x2 中不存在整个向量,是否有办法返回 NA?
    • @Zofhd 检查我的编辑:)
    【解决方案4】:

    stringr 的另一种方法;

       library(tidyverse)
    
    x1_ <- paste0(x1,collapse="")
    x2_ <- paste0(x2,collapse="")
    str_locate_all(x2_, x1_)[[1]]
    

    给予,

         start end
    [1,]     3   5
    [2,]    11  13
    

    如果没有匹配则返回空。

    【讨论】:

      猜你喜欢
      • 2020-09-17
      • 2018-04-24
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      相关资源
      最近更新 更多