例如,我有两个向量:
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
解释:
这使用embed
将x2
按x1
的长度分成块,并应用它并检测它是否等同于x1
,并给出一个布尔向量(或TRUE
s和FALSE
s),然后最后使用which
获得TRUE
出现的索引,我使用[1]
获得第一个值。
对于编辑,我检测是否在条件布尔向量中包含任何TRUE
s,如果是,做与上面提到的相同的事情,如果没有,给出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
如果没有匹配则返回空。