[R] How do you test for "consecutivity"?

Marc Schwartz marc_schwartz at comcast.net
Tue Apr 29 15:04:39 CEST 2008


Anthony28 wrote:
> I need to use R to model a large number of experiments (say, 1000). Each
> experiment involves the random selection of 5 numbers (without replacement)
> from a pool of numbers ranging between 1 and 30.
> 
> What I need to know is what *proportion* of those experiments contains two
> or more numbers that are consecutive. So, for instance, an experiment that
> yielded the numbers 2, 28, 31, 4, 27 would be considered a "consecutive =
> true" experiment since 28 and 27 are two consecutive numbers, even though
> they are not side-by-side.
> 
> I am quite new to R, so really am puzzled as to how to go about this. I've
> tried sorting each experiment, and then subtracting adjacent pairs of
> numbers to see if the difference is plus or minus 1. I'm also unsure about
> whether to use an array to store all the data first.
> 
> Any assistance would be much appreciated.



Vec <- c(2, 28, 31, 4, 27)

 > Vec
[1]  2 28 31  4 27

# Sort the vector
 > sort(Vec)
[1]  2  4 27 28 31

# Get differences between sequential elements
 > diff(sort(Vec))
[1]  2 23  1  3

# Are any differences == 1?
 > any(diff(sort(Vec)) == 1)
[1] TRUE

See ?sort, ?diff and ?any for more information

On your last question, if the data are all numeric and each experiment 
contains 30 elements from which you select five, then you can store the 
data in a N x 30 matrix, where N is the number of source data sets. The 
result could be stored in a N x 5 matrix.

You can then run your test of sequential members as follows, presuming 
'Res' contains the N x 5 result matrix:

   prop.table(table(apply(Res, 1, function(x) any(diff(sort(x)) == 1)))

The output will be the proportion TRUE/FALSE of rows that have 
sequential elements.

HTH,

Marc Schwartz



More information about the R-help mailing list