A simple and possibly inelegant way to create a counter and reverse counter, by group, for a data frame. Works for me.
# counter_reverse_counter
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
id <- c("A", "A", "A", "B", "B", "B", "C", "C", "C", "C")
event <- c("X", "Y", "Z", "Z", "Z", "X", "Y", "Z", "X", "W")
startdate <- as.Date(
c(
'2010-01-01',
'2010-02-02',
'2010-03-03',
'2011-01-01',
'2011-02-02',
'2011-03-03',
'2012-01-01',
'2012-02-02',
'2012-03-03',
'2012-04-04'
)
)
DF1 <- data.frame(id, event, startdate)
DF1
## id event startdate
## 1 A X 2010-01-01
## 2 A Y 2010-02-02
## 3 A Z 2010-03-03
## 4 B Z 2011-01-01
## 5 B Z 2011-02-02
## 6 B X 2011-03-03
## 7 C Y 2012-01-01
## 8 C Z 2012-02-02
## 9 C X 2012-03-03
## 10 C W 2012-04-04
DF2 <- DF1 %>%
group_by(id) %>%
arrange(startdate) %>%
mutate(counter = row_number()) %>%
arrange(desc(startdate)) %>%
mutate(reverse_counter = row_number()) %>%
arrange(id, startdate)
DF2
## # A tibble: 10 x 5
## # Groups: id [3]
## id event startdate counter reverse_counter
## <fct> <fct> <date> <int> <int>
## 1 A X 2010-01-01 1 3
## 2 A Y 2010-02-02 2 2
## 3 A Z 2010-03-03 3 1
## 4 B Z 2011-01-01 1 3
## 5 B Z 2011-02-02 2 2
## 6 B X 2011-03-03 3 1
## 7 C Y 2012-01-01 1 4
## 8 C Z 2012-02-02 2 3
## 9 C X 2012-03-03 3 2
## 10 C W 2012-04-04 4 1