Ускорьте функцию, которая проверяет последовательность

Я создал функцию 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" «б» "c" «д» «д» «е» "g" «h» «i» «j»

Если, например, мы перевернем шаблон, то получим ЛОЖЬ:

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

Меня не устраивает скорость этой функции. Вы можете мне с этим помочь?

1 ответ
1

Вот векторизованная версия:

yes.seq <- function(dat, pat) {
  paste(dat[dat %in% pat], collapse = "") == paste(pat, collapse = "")
}

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

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *