The ave
function computes a function by group.
> id <- c(1,2,3,2,2,1,2,3)
> data.frame(id,count=ave(id==id, id, FUN=cumsum))
id count
1 1 1
2 2 1
3 3 1
4 2 2
5 2 3
6 1 2
7 2 4
8 3 2
I use id==id
to create a vector of all TRUE
values, which get converted to numeric when passed to cumsum
. You could replace id==id
with rep(1,length(id))
.