С data.table
мы можем использовать rleid
с rowid
library(data.table)
setDT(DF)[, C := rowid(rleid(B))]
DF
# A B C
# 1: 0 0 1
# 2: 0 0 2
# 3: 0 0 3
# 4: 0 1 1
# 5: 0 1 2
# 6: 0 2 1
# 7: 0 3 1
# 8: 0 3 2
# 9: 1 0 1
#10: 1 0 2
#11: 1 1 1
#12: 1 1 2
#13: 2 0 1
#14: 2 1 1
#15: 2 2 1
data
DF <- structure(list(A = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L,
1L, 1L, 2L, 2L, 2L), B = c(0L, 0L, 0L, 1L, 1L, 2L, 3L, 3L, 0L,
0L, 1L, 1L, 0L, 1L, 2L)), class = "data.frame", row.names = c(NA,
-15L))