Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Collapse continuous integer runs to strings of ranges

Tags:

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")) 
like image 717
Tyler Rinker Avatar asked Feb 14 '13 05:02

Tyler Rinker


People also ask

What is a collapsed range in JavaScript?

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.

What does the range collapse () method do?

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.

How to merge intervals in a time series?

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.

How to generate groups of consecutive integers in a list?

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))


1 Answers

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" 
like image 60
Marius Avatar answered Oct 06 '22 03:10

Marius