Reputation: 1069
I have an array with several numbers in it and I don't know beforehand what the numbers will be. I would like to separate out those numbers in the array which are not sequential to the previous number (in addition to the first number in the sequence).
For example:
Array: 2 3 4 5 10 11 12 15 18 19 20 23 24
I would like to return 2 10 15 18 23
The original array could be of variable length, including length zero
Thanks
Upvotes: 5
Views: 1814
Reputation: 21532
Oddly enough :-), I get to proffer one of my creations: cgwtools:seqle
. seqle
works just like rle
but returns sequence runs rather than repetition runs.
foo<- c(2,3,4,5,10,11,12,15,18,19,20,23,24)
seqle(foo)
Run Length Encoding
lengths: int [1:5] 4 3 1 3 2
values : num [1:5] 2 10 15 18 23
Upvotes: 5
Reputation: 887501
Try
v1 <- c(2:5,10:12,15, 18:20, 23:24)
v1[c(TRUE,diff(v1)!=1)]
#[1] 2 10 15 18 23
If you want to get the last sequential number, try
v1[c(diff(v1)!=1, TRUE)]
#[1] 5 12 15 20 24
Upvotes: 11
Reputation: 15718
You can use function lag
from package dplyr
:
arr <- c(2, 3, 4, 5, 10, 11, 12, 15, 18, 19, 20, 23, 24)
index_not_sequential <- which(arr - dplyr::lag(arr, 1, default=-1 ) != 1)
arr[index_not_sequential]
gives
[1] 2 10 15 18 23
Upvotes: 2