【问题标题】:Match all elements of a pattern with a vector and in the same order以相同的顺序将模式的所有元素与向量匹配
【发布时间】:2021-03-02 20:38:25
【问题描述】:

我创建了一个函数yes.seq,它接受两个参数,一个模式pat 和数据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

因为这个序列在模式中顺序相同

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

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

yes.seq(pat = pat, dat = rev(dat))
# [1] FALSE

这是我的功能

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)   )
}

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

【问题讨论】:

    标签: r sequence


    【解决方案1】:

    我们可以paste 他们并使用grepl

    grepl(paste(pat, collapse=".*"), paste(dat, collapse=""))
    #[1] TRUE
    

    str_detect

    library(stringr)
    str_detect(paste(dat, collapse=""), paste(pat, collapse=".*"))
    #[1] TRUE
    

    【讨论】:

      【解决方案2】:

      另一种选择:

      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
      

      【讨论】:

      • 但是,如果 pat 中的任何元素在模式出现之前出现,这些解决方案就会失败。 yes.seq(pat = c("a", "b"), dat = c("b", "a", "b")) # returns FALSE
      • 很好,对不起,这没有抓住那个。
      【解决方案3】:

      这是另一个基本 R 选项

      yes.seq <- function(pat,dat) identical(order(match(pat, dat)), seq_along(pat))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多