data.table
offers a nice convenience function, rleid for run-length encoding:
library(data.table)
DT = data.table(grp=rep(c(\"A\", \"B\", \"C\",
You can just do (when you have both data.table and dplyr loaded):
DT <- DT %>% mutate(rlid = rleid(grp))
this gives:
> DT grp value rlid 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
When you don't want to load data.table separately you can also use (as mentioned by @DavidArenburg in the comments):
DT <- DT %>% mutate(rlid = data.table::rleid(grp))
And as @RichardScriven said in his comment you can just copy/steal it:
myrleid <- data.table::rleid