В базе R мы можем использовать ave
:
with(DT, ave(v1, c(0, cumsum(v1)[-length(v1)]), FUN = seq_along))
#[1] 1 2 3 4 1 2 3
В dplyr
мы можем использовать lag
для создания групп и назначения номера строки в каждой группе.
library(dplyr)
DT %>% group_by(gr = lag(cumsum(v1), default = 0)) %>% mutate(ID = row_number())
и мы можем использовать тот же лог c в data.table
:
library(data.table)
setDT(DT)[, ID := seq_len(.N), shift(cumsum(v1), fill = 0)]