是否有 R 函数在另一个向量中找到一个向量?

Is there an R function finding a vector within another vector?

例如我有两个向量:

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 函数或构造函数的方法?

谢谢!

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

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

对于向量 x1 的所有元素。

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

如果您要查找 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.

另一种方法 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

如果没有匹配项,returns 为空。