R - Создать строку, которая суммирует вектор целых чисел, заменяя последовательные значения начальным и конечным значением последовательности - PullRequest
6 голосов
/ 08 февраля 2012

Я ищу эффективный способ упростить вектор целых чисел в виде итоговой строки, чтобы отформатировать его для размещения в ячейке таблицы.

Например:

c(1, 2, 3, 4, 6, 8, 9, 10)

должен производить

"1-4, 6, 8-10"

Это становится особенно полезным в тех случаях, когда печать всех элементов в векторе быстро сделает таблицу нечитаемой.

Например,

c(1:50, 53, 89:120)

должен произвести

"1-50, 53, 89-120"

1 Ответ

9 голосов
/ 08 февраля 2012

Вы хотите сгруппировать элементы в блоки последовательных целых чисел. diff может сказать вам, если два последовательных элемента находятся в одном блоке, cumsum может нумеровать блоки и tapply может извлечь первый и последний элемент каждого блока.

x <- c(1:50, 53, 89:120)
y <- tapply( x, c(0,cumsum(diff(x) != 1)), range )
# Format the result
y <- sapply(y, function(u) 
  if(u[1]==u[2]) u[1] 
  else paste(u,collapse=":")
)
paste(y, collapse=", ")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...