Add an index (or counter) to a dataframe by group in R

counter, indexing, plyr, r, seq

Solution

A `dplyr` solution is quite simple:

library(dplyr)

df %>% group_by(ProjectID) %>% mutate(counter = row_number(ProjectID))


#  ProjectID Dist counter
#1         1    x       1
#2         1    y       2
#3         2    z       1
#4         2    x       2
#5         2    h       3
#6         1    k       3

Problem

I have a df like ``` ProjectID Dist 1 x 1 y 2 z 2 x 2 h 3 k .... .... ``` I want to add a third column such that we have an incrementing counter for each ProjectID: ``` ProjectID Dist counter 1 x 1 1 y 2 2 z 1 2 x 2 2 h 3 1 k 3 .... .... ``` I've had a look at `seq` `rank` and a couple of other bits particularly looking to see if I could use `ddply` to help: ``` df$counter <- ddply(df,.(projectID), function(x).....? ) ``` I think I could adapt this answer How to create a counter/numeration by group? but would prefer something using something like ddply (I can't find an equivalent of cumsum but I think that's the same principle here: Create ascending series of integers by group in Pandas ). That'd let me index occurrences in a list (and e.g. merge on this).

Original source

Related problems