Есть ли способ кодирования увеличения целочисленных последовательностей в 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"