data.table offers a nice convenience function, rleid for run-length encoding:
data.table
library(data.table) DT = data.table(grp=rep(c(\"A\", \"B\", \"C\",
You can do it using the lag function from dplyr.
lag
dplyr
DT <- DT %>% mutate(rleid = (grp != lag(grp, 1, default = "asdf"))) %>% mutate(rleid = cumsum(rleid))
gives
> DT grp value rleid 1: A 1 1 2: A 2 1 3: B 3 2 4: B 4 2 5: C 5 3 6: C 6 3 7: C 7 3 8: A 8 4 9: B 9 5 10: B 10 5