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



例如,我有两个向量:

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

我想找到x1首先出现在x2的位置,在这种情况下x2是3。我试过which(),match(),但两者似乎都找到了元素,而不是向量。有没有一个R函数可以达到这个目的或者有办法构造一个?

谢谢!

如果您正在寻找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

解释:

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

对于编辑,我检测是否在条件布尔向量中包含任何TRUEs,如果是,做与上面提到的相同的事情,如果没有,给出NA

一种选择是滚动比较。

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

另一种使用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

如果没有匹配则返回空。