是否有 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
解释:
这里使用embed
将x2
分成x1
长度的块,并应用它并检测它是否等同于x1
,并给出布尔向量(或 TRUE
s 和 FALSE
s)。最后它使用 which
获取 TRUE
出现的索引,我使用 [1]
获取第一个值。
对于编辑,我检测条件布尔向量中是否包含任何 TRUE
s,如果是,则执行与上述相同的操作,如果不是,则给出 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 为空。
例如我有两个向量:
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
解释:
这里使用embed
将x2
分成x1
长度的块,并应用它并检测它是否等同于x1
,并给出布尔向量(或 TRUE
s 和 FALSE
s)。最后它使用 which
获取 TRUE
出现的索引,我使用 [1]
获取第一个值。
对于编辑,我检测条件布尔向量中是否包含任何 TRUE
s,如果是,则执行与上述相同的操作,如果不是,则给出 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 为空。