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"))
A collapsed Range is empty, containing no content, specifying a single-point in a DOM tree. To determine if a Range is already collapsed, see the Range.collapsed property. A boolean value: true collapses the Range to its start, false to its end.
The Range.collapse () method collapses the Range to one of its boundary points. A collapsed Range is empty, containing no content, specifying a single-point in a DOM tree.
Given a set of time intervals in any order, merge all overlapping intervals into one and output the result which should have only mutually exclusive intervals. Let the intervals be represented as pairs of integers for simplicity.
5 Answers 5 ActiveOldestVotes 18 \$\begingroup\$ You could use this one-liner to generate groups of consecutive integers in a list: from itertools import groupby, count groupby(numberlist, lambda n, c=count(): n-next(c))
I think diff
is the solution. You might need some additional fiddling to deal with the singletons, but:
lapply(z, function(x) { diffs <- c(1, diff(x)) start_indexes <- c(1, which(diffs > 1)) end_indexes <- c(start_indexes - 1, length(x)) coloned <- paste(x[start_indexes], x[end_indexes], sep=":") paste0(coloned, collapse=", ") }) $greg [1] "7:11, 20:24, 30:33, 49:49" $researcher [1] "42:48" $sally [1] "25:29, 37:41" $sam [1] "1:6, 16:19, 34:36" $teacher [1] "12:15"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With