0
\$\begingroup\$

I created a function yes.seq that takes two arguments, a pattern pat and data dat, the function looks for the presence of a pattern in the data and in the same sequence.

For example:

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

because this sequence is in the pattern and in the same order.

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

If, for example, we reverse the pattern, then we get FALSE:

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

Here is my function:

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

I am not satisfied with the speed of this function. Can you help me with that?

\$\endgroup\$
2

1 Answer 1

1
\$\begingroup\$

Here is a vectorized version:

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
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.