R Dplyr Counter and Reverse Counter.

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

ENDS