I have some data in a list that I need to look for continuous runs of integers (My brain thinkrle
but don't know how to use it here).
It's easier to look at the data set and explain what I'm after.
Here's the data view:
$greg
[1] 7 8 9 10 11 20 21 22 23 24 30 31 32 33 49
$researcher
[1] 42 43 44 45 46 47 48
$sally
[1] 25 26 27 28 29 37 38 39 40 41
$sam
[1] 1 2 3 4 5 6 16 17 18 19 34 35 36
$teacher
[1] 12 13 14 15
Desired output:
$greg
[1] 7:11, 20:24, 30:33, 49
$researcher
[1] 42:48
$sally
[1] 25:29, 37:41
$sam
[1] 1:6, 16:19 34:36
$teacher
[1] 12:15
Use base packages how can I replace continuous span with a colon between highest and lowest and commas in between non the non continuous parts? Note that the data goes from a list of integer vectors to a list of character vectors.
MWE data:
z <- structure(list(greg = c(7L, 8L, 9L, 10L, 11L, 20L, 21L, 22L,
23L, 24L, 30L, 31L, 32L, 33L, 49L), researcher = 42:48, sally = c(25L,
26L, 27L, 28L, 29L, 37L, 38L, 39L, 40L, 41L), sam = c(1L, 2L,
3L, 4L, 5L, 6L, 16L, 17L, 18L, 19L, 34L, 35L, 36L), teacher = 12:15), .Names = c("greg",
"researcher", "sally", "sam", "teacher"))
Late to the party, but here's a
deparse
based one-liner:Another short solution with
lapply
andtapply
:The result:
I think
diff
is the solution. You might need some additional fiddling to deal with the singletons, but:I have a fairly similar solution to Marius, his works as well as mine but the mechanisms are slightly different so I thought I may as well post it:
Which produces:
Using
IRanges
:Here is an attempt using
diff
andtapply
returning a character vector