【发布时间】: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)
例如,我有两个向量:
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)
一种选择是进行滚动比较。
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,并给出一个布尔向量(或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
如果没有匹配则返回空。
【讨论】: