как скрыть вектор целых чисел без повторов в несколько последовательных и дискретных частей и экспортировать в определенном формате с использованием R?

#r

#r

Вопрос:

Ниже приведен пример данных:

 dat<-c(1:10,14,17:20,30)
  

Мой желаемый формат вывода:

 1-10,14,17-10,30
  

У меня большой похожий вектор, поэтому я пытаюсь использовать R для его создания. Кто-нибудь может дать несколько советов предложений? Большое вам спасибо!

Ответ №1:

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

 dat <- c(1:10,14,17:20,30)

result <- as.character(tapply(dat, cumsum(c(TRUE, diff(dat) > 1)), function(x) {
  if(length(x) == 1) x else paste(x[1], x[length(x)], sep = '-')
}))

result
#[1] "1-10"  "14"    "17-20" "30"   
  

Если вы хотите вывести в виде одной строки.

 toString(result)
#[1] "1-10, 14, 17-20, 30"
  

Ответ №2:

Базовое решение R (очень похожее в принципе на решение Ронака:

 sapply(split(dat, cumsum(c(FALSE, diff(dat) > 1))), function(x){
    paste(unique(range(x)), collapse = "-")
  }
)