以相同的顺序将模式的所有元素与向量匹配

mr.*_*r.T 4 r sequence

我创建了一个函数yes.seq,它接受两个参数,一个 patternpat和 data dat。该函数查找数据中是否存在相同序列的模式

例如

dat <- letters[1:10]
dat
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
pat <- c('a',"c","g")
 
yes.seq(pat = pat,dat = dat)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

因为这个序列在模式中并且以相同的顺序

"a"“b” "c"“d”“e”“f” "g"“h”“i”“j”

例如,如果 'dat' 被反转,那么我们得到FALSE

yes.seq(pat = pat, dat = rev(dat))
# [1] FALSE
Run Code Online (Sandbox Code Playgroud)

这是我的功能

yes.seq <- function(pat , dat){  
  lv <- rep(F,length(pat))
  k <- 1     
  for(i in 1:length(dat)){        
            if(dat[i] == pat[k]) 
              {
              lv[k] <- TRUE
              k <- k+1 
              }       
    if(k==length(pat)+1) break
  }
  return(  all(lv)   )
}
Run Code Online (Sandbox Code Playgroud)

有没有更有效的解决方案,这个功能对我来说太慢了

akr*_*run 5

我们可以paste使用它们grepl

grepl(paste(pat, collapse=".*"), paste(dat, collapse=""))
#[1] TRUE
Run Code Online (Sandbox Code Playgroud)

或者 str_detect

library(stringr)
str_detect(paste(dat, collapse=""), paste(pat, collapse=".*"))
#[1] TRUE
Run Code Online (Sandbox Code Playgroud)


r2e*_*ans 5

另外一个选项:

yes.seq <- function(pat, dat) {
  all(pat %in% dat) && all(diff(na.omit(match(pat, dat))) > 0)
}
yes.seq(pat, dat)
# [1] TRUE
yes.seq(c(pat, "ZZ"), dat)
# [1] FALSE
yes.seq(pat, rev(dat))
# [1] FALSE
Run Code Online (Sandbox Code Playgroud)

  • 然而,如果 pat 中的任何元素在该模式出现之前出现,这些解决方案就会失败。`yes.seq(pat = c("a", "b"), dat = c("b", "a", "b")) # 返回 FALSE` (2认同)