#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 = "-")
}
)