The solution is from the base R.
a <- c(1,1,0,0,1,2,0,0)
b <- rle(a)
dt <- data.frame(number = b$values, lengths = b$lengths)
dt$end <- cumsum(dt$lengths)
dt$start <- dt$end - dt$lengths + 1
dt <- dt[, c("number", "start", "end")]
dt <- dt[order(dt$number), ]
dt
Update
Here is a solution using with
to make the code more concise.
with(rle(a), data.frame(number = values,
start = cumsum(lengths) - lengths + 1,
end = cumsum(lengths))[order(values),])
source
share