Как начать новый подсчет, когда значение категориальной переменной изменилось в R

Образец моего набора данных

 datatrain=structure(list(DELT = c(10266L, 10266L, 10266L, 9635L, 9635L, 
    9635L, 10334L, 10334L, 10061L, 10061L, 10061L, 9512L, 9512L, 
    9512L, 10394L, 10394L, 9631L, 10376L, 10376L, 10376L, 10376L, 
    10046L, 9678L, 10332L, 10332L, 9985L, 9850L, 9850L, 10074L, 9746L, 
    9746L), EP_OBJECTID = c(86913544L, 86913544L, 86913544L, 86913544L, 
    86913544L, 86913544L, 86913544L, 86913544L, 86913544L, 86913544L, 
    86913544L, 86913544L, 86913544L, 86913544L, 86913544L, 86913544L, 
    86913544L, 86913544L, 86913544L, 86913544L, 90093693L, 90093693L, 
    90093693L, 90093693L, 90093693L, 90093693L, 90093693L, 90093693L, 
    90093693L, 90093693L, 90093693L), DELTDMR = c(0L, 0L, 0L, 8L, 
    8L, 8L, 0L, 0L, 2L, 2L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 65L, 65L, 
    65L, 65L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 3L, 3L)), class = "data.frame", row.names = c(NA, 
    -31L))

EP_OBJECTID — категориальная переменная. Здесь только две категории

86913544
90093693

как установить порядковый номер от первого значения категории 86913544 до последнего числа перед новой категорией 90093693 в диапазоне 10000? то есть результат

DELT    EP_OBJECTID DELTDMR
10000   86913544    0
20000   86913544    0
30000   86913544    0
40000   86913544    8
50000   86913544    8
60000   86913544    8
70000   86913544    0
80000   86913544    0
90000   86913544    2
100000  86913544    2
110000  86913544    2
120000  86913544    0
130000  86913544    0
140000  86913544    0
150000  86913544    0
160000  86913544    0
170000  86913544    0
180000  86913544    65
190000  86913544    65
200000  86913544    65

И как тогда удалить последнее значение категории =86913544 (= 65), которое стоит перед первым значением новой категории. В этом примере новая категория 90093693 также имеет значение 65, но новый отсчет начинается со второго значения категории 90093693(=0). Также в диапазоне 10000

т.е. результат

DELT    EP_OBJECTID DELTDMR
10000   86913544    0
20000   86913544    0
30000   86913544    0
40000   86913544    8
50000   86913544    8
60000   86913544    8
70000   86913544    0
80000   86913544    0
90000   86913544    2
100000  86913544    2
110000  86913544    2
120000  86913544    0
130000  86913544    0
140000  86913544    0
150000  86913544    0
160000  86913544    0
170000  86913544    0
180000  86913544    65
190000  86913544    65
200000  86913544    65

10000 90093693 0

20000   90093693    0
30000   90093693    0
40000   90093693    0
50000   90093693    0
60000   90093693    0
70000   90093693    0
80000   90093693    0
90000   90093693    3
100000  90093693    3

и это для каждой категории. Как это выполнить?


person D.Joe    schedule 10.02.2021    source источник


Ответы (1)


Удалите строки, в которых EP_OBJECTID не равно предыдущему значению EP_OBJECTID, а DELTDMR равно предыдущему значению DELTDMR. Для каждого EP_OBJECTID создайте последовательность, начинающуюся с 10 000 с шагом 10 000.

library(dplyr)

datatrain %>%
  filter(!(EP_OBJECTID != lag(EP_OBJECTID) & DELTDMR == lag(DELTDMR))) %>%
  group_by(EP_OBJECTID) %>%
  mutate(DELT = seq(10000, length.out = n(), by = 10000))

Это возвращает:

#     DELT EP_OBJECTID DELTDMR
#1   10000    86913544       0
#2   20000    86913544       0
#3   30000    86913544       8
#4   40000    86913544       8
#5   50000    86913544       8
#6   60000    86913544       0
#7   70000    86913544       0
#8   80000    86913544       2
#9   90000    86913544       2
#10 100000    86913544       2
#11 110000    86913544       0
#12 120000    86913544       0
#13 130000    86913544       0
#14 140000    86913544       0
#15 150000    86913544       0
#16 160000    86913544       0
#17 170000    86913544      65
#18 180000    86913544      65
#19 190000    86913544      65
#20  10000    90093693       0
#21  20000    90093693       0
#22  30000    90093693       0
#23  40000    90093693       0
#24  50000    90093693       0
#25  60000    90093693       0
#26  70000    90093693       0
#27  80000    90093693       0
#28  90000    90093693       3
#29 100000    90093693       3
person Ronak Shah    schedule 10.02.2021