例如,我有兩個向量:
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 函式可以實作這一點或構建一個方法?
謝謝!
uj5u.com熱心網友回復:
如果您正在尋找第一個匹配項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]用來獲取第一個值。
對于編輯,我檢測條件布爾向量中TRUE是否包含任何s,如果是,則執行與上述相同的操作,如果沒有,則給出NA。
uj5u.com熱心網友回復:
一種選擇是進行滾動比較。
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
uj5u.com熱心網友回復:
對于向量 x1 的所有元素。
sapply(x1, function(x) match(x,x2))
[1] 3 1 2
uj5u.com熱心網友回復:
另一種方法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
如果沒有匹配,則回傳空。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/324575.html
上一篇:用R中的變數替換串列鍵名
下一篇:在R中優化qbeta的運行時
