[R] sequences extraction

GREGOR Brian J
Fri, 20 Apr 2007 18:00:22 -0000

Here's a solution which uses diff() and apply.

findSequences <- function(Data){
     # Sort the vector in case it hasn't been sorted
     Data <- sort(Data)
     # Check that there are no duplicate values in Data
     if(any(duplicated(Data))) stop("Function with not work if Data
argument contains duplicate values.")
     # Make a matrix of the starting and ending indices of sequences
     Breaks <- which(diff(Data) != 1)
     Starts <- c(0, Breaks) + 1
     Ends <- c(Breaks, length(Data))
     SequenceIndices <- cbind(Starts, Ends)
     # Return a list of vectors of sequences
     apply(SequenceIndices, 1, function(x) Data[x[1]:x[2]])
     }

>> I need to extract sequences from an ordered vector.
>> For example, if
>> a<-c(1,2,3,6,10,11,13)
>> I need to get the followings 4 vectors
>> (1,2,3),(6),(10,11),(13)

>There should be a more elegant way to do it, but the following code
>seems to work (it returns the results a s a list) :


>a<-c(9,1,2,3,6,10,11,17,13,14)
>d <- diff(a)
>result <- list()
>tmp <- a[1]
>for (i in 1:length(d)) {
>        if (d[i]==1) {
>                tmp <- c(tmp, a[i+1])
>        } else {
>                result <- c(result,list(tmp))
>                tmp <- a[i+1]
>        }
>}
>result <- c(result,list(tmp))
>result


Brian Gregor, P.E.
Transportation Planning Analysis Unit
Oregon Department of Transportation
Brian.J.GREGOR at odot.state.or.us
(503) 986-4120