Я создал функцию 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 ответ
Вот векторизованная версия:
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