Есть ли способ кодировать возрастающие целые последовательности в R, аналогичные длинам прогона кодирования с использованием кодирования длины прогона (rle
)?
Я проиллюстрирую пример:
Аналогия: кодирование длины пробега
r <- c(rep(1, 4), 2, 3, 4, rep(5, 5))
rle(r)
Run Length Encoding
lengths: int [1:5] 4 1 1 1 5
values : num [1:5] 1 2 3 4 5
Желательно: кодирование длины последовательности
s <- c(1:4, rep(5, 4), 6:9)
s
[1] 1 2 3 4 5 5 5 5 6 7 8 9
somefunction(s)
Sequence lengths
lengths: int [1:4] 5 1 1 5
value1 : num [1:4] 1 5 5 5
Изменить 1
Таким образом, somefunction(1:10)
даст результат:
Sequence lengths
lengths: int [1:1] 10
value1 : num [1:1] 1
Эти результаты означают, что существует целая последовательность длиной 10 с начальным значением 1, то есть seq(1, 10)
Обратите внимание, что в моем примере нет ошибки. Фактически вектор заканчивается в последовательности 5: 9, а не 6: 9, которая использовалась для его построения.
Моим вариантом использования является то, что я работаю с данными опроса в файле экспорта SPSS. Каждое подзапрос в сетке вопросов будет иметь имя шаблона paste("q", 1:5)
, но иногда есть "другая" категория, которая будет отмечена q_99
, q_other
или что-то еще. Я хочу найти способ идентификации последовательностей.
Изменить 2
В некотором смысле, моя желаемая функция - это инверсия базовой функции sequence
, с начальным значением, value1
в моем примере, добавлено.
lengths <- c(5, 1, 1, 5)
value1 <- c(1, 5, 5, 5)
s
[1] 1 2 3 4 5 5 5 5 6 7 8 9
sequence(lengths) + rep(value1-1, lengths)
[1] 1 2 3 4 5 5 5 5 6 7 8 9
Изменить 3
Я должен был сказать, что для моих целей последовательность определяется как увеличение целых последовательностей в отличие от монотонно возрастающих последовательностей, например. c(4,5,6,7)
, но не c(2,4,6,8)
и c(5,4,3,2,1)
. Однако любое другое целое число может появляться между последовательностями.
Это означает, что решение должно быть в состоянии справиться с этим тестовым случаем:
somefunction(c(2, 4, 1:4, 5, 5))
Sequence lengths
lengths: int [1:4] 1 1 5 1
value1 : num [1:4] 2 4 1 5
В идеальном случае решение также может справиться с предложенным вариантом использования, который будет включать символы в вектор, например.
somefunction(c(2, 4, 1:4, 5, "other"))
Sequence lengths
lengths: int [1:5] 1 1 5 1 1
value1 : num [1:5] 2 4 1 5 "other"