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?
-
\$\begingroup\$ can you add example data on which the function doesn't perform well? \$\endgroup\$minem– minem2021年03月03日 08:31:42 +00:00Commented Mar 3, 2021 at 8:31
-
\$\begingroup\$ Cross-posted on SO: Match all elements of a pattern with a vector and in the same order. Please read Is it OK to cross post here and in SO? "No, it's not ok. Yes, it would be bad manners." \$\endgroup\$Henrik– Henrik2021年03月28日 23:08:02 +00:00Commented Mar 28, 2021 at 23:08
1 Answer 1
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