On Fri, Apr 06, 2012 at 10:25:15AM -0700, ens wrote: > > a<-sample(1:6,100,replace=T) > > a > [1] 2 4 3 4 5 1 3 2 4 3 6 6 2 6 2 1 5 5 3 4 6 1 6 6 3 4 6 6 4 4 5 4 6 5 6 > 3 4 5 6 3 4 1 6 6 6 4 2 1 1 3 1 5 3 2 2 6 2 5 > [59] 2 6 1 6 1 1 6 4 4 2 2 3 4 5 6 1 6 4 6 1 5 1 1 2 1 3 4 4 6 3 1 4 1 1 1 > 5 5 2 4 6 5 1 > which(a<=3) > [1] 1 3 6 7 8 10 13 15 16 19 22 25 36 40 42 47 48 49 > 50 51 53 54 55 57 59 61 63 64 68 > [30] 69 70 74 78 80 81 82 83 84 88 89 91 92 93 96 100 > > I want to know if the indices are sequential and if so, how many of them are > sequential in a row. Does anyone know the least clumsy way to do this. I am > a C++ user by default, so my instinct is probably too mess for R.
Hi. Try this. set.seed(12345) (a<-sample(1:6,100,replace=T)) [1] 5 6 5 6 3 1 2 4 5 6 1 1 5 1 3 3 3 3 2 6 3 2 6 5 4 3 5 4 2 3 5 1 2 5 3 3 6 [38] 6 4 1 5 3 6 5 2 2 1 1 1 4 6 5 2 2 5 3 5 1 3 2 5 2 6 5 6 2 6 1 4 6 5 4 3 3 [75] 1 4 6 4 4 1 6 4 1 1 1 2 5 4 5 1 6 5 1 4 5 4 5 5 1 3 out <- rle(a <= 3) out$lengths[out$values] [1] 3 2 6 2 1 2 2 2 1 1 5 2 1 3 1 1 1 3 1 4 1 1 2 The first 3 is due to (3 1 2). The next 2 is due to (1 1), The next 6 is due to (1 3 3 3 3 2). The starting indices of the blocks are c(0, cumsum(out$lengths))[which(out$values)] + 1 [1] 5 11 14 21 26 29 32 35 40 42 45 53 56 58 62 66 68 73 80 83 90 93 99 The endings are cumsum(out$lengths)[which(out$values)] [1] 7 12 19 22 26 30 33 36 40 42 49 54 56 60 62 66 68 75 80 [20] 86 90 93 100 Hope this helps. Petr Savicky. ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.