Определите разные последовательности с одинаковыми элементами - PullRequest
0 голосов
/ 31 мая 2019

Я хотел бы получить вектор последовательности, на который не влияют равные значения.

group = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3 )

x = c("B","B",NA,"A","B","C","D", "A","A",NA,"A","A","A", "D","A","A","D","C","D")

dad = data.frame(group, x)

Ожидаемый вектор

out = c(1,1,NA,2,3,4,5, 1,1,NA,1,1,1, 1,2,2,3,4,5)

dad = cbind(dad, out)

То есть, например, в группе 1 элемент "B" появляется снова, но он должен продолжать последовательность, когда есть изменение в последовательности. В случаях NA будет NA.

1 Ответ

2 голосов
/ 31 мая 2019

Опция с data.table. Преобразуйте файл «data.frame» в «data.table» (setDT(dad)), сгруппированный по «group», укажите i с логическим индексом, чтобы выбрать только те строки, где «x» не является NA, и получите идентификатор длины серии (rleid) из 'x', который будет назначен как новый столбец 'ind'

library(data.table)
setDT(dad)[!is.na(x),  ind := rleid(x), group]
dad
#    group    x ind
#1:     1    B   1
#2:     1    B   1
#3:     1 <NA>  NA
#4:     1    A   2
#5:     1    B   3
#6:     1    C   4
#7:     1    D   5
#8:     2    A   1
#9:     2    A   1
#10     2 <NA>  NA
#11:    2    A   1
#12:    2    A   1
#13:    2    A   1
#14:    3    D   1
#15:    3    A   2
#16:    3    A   2
#17:    3    D   3
#18:    3    C   4
#19:    3    D   5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...