[R] matching a sequence in a vector?

Petr Savicky savicky at cs.cas.cz
Wed Feb 15 08:45:22 CET 2012


On Wed, Feb 15, 2012 at 02:17:35PM +1000, Redding, Matthew wrote:
> Hi All,
> 
> 
> I've been trawling through the documentation and listserv archives on this topic -- but
> as yet have not found a solution.  I'm sure this is pretty simple with R, but I cannot work out how without
> resorting to ugly nested loops.
> 
> As far as I can tell, grep, match, and %in% are not the correct tools.
> 
> Question:
> given these vectors --
> patrn <- c(1,2,3,4)
> exmpl <- c(3,3,4,2,3,1,2,3,4,8,8,23,1,2,3,4,4,34,4,3,2,1,1,2,3,4)
> 
> how do I get the desired answer by finding the occurence of the pattern and returning the starting indices:
> 6, 13, 23

Hi.

If the pattern is not too long, try

  m <- length(patrn)
  n <- length(exmpl)
  ind <- seq.int(length=n-m+1)
  occur <- rep(TRUE, times=n-m+1)
  for (i in seq.int(length=m)) {
      occur <- occur & (patrn[i] == exmpl[ind + i - 1])
  }
  which(occur)

  [1]  6 13 23

Hope this helps.

Petr Savicky.



More information about the R-help mailing list