1

I want to get a cumulative count of a character column "status":

id<-c(2,2,2,2,3,3,3,3)
age<-c(12,14,16,18,11,13,14,15)
status<-c('A','C','B','C','C','C','B','B')
myd<-data.frame(id,age,status)

  id age status
1  2  12      A
2  2  14      C
3  2  16      B
4  2  18      C
5  3  11      C
6  3  13      C
7  3  14      B
8  3  15      B

so ideally the data will look like

  id age status num
1  2  12      A   1
2  2  14      C   1
3  2  16      B   1
4  2  18      C   2
5  3  11      C   1
6  3  13      C   2
7  3  14      B   1
8  3  15      B   2

Cumsum doesn't work in this scenario:

myd %>% group_by(status) %>% arrange(id,age) %>% mutate(num=cumsum(status)) 

elliezee
  • 113
  • 4

2 Answers2

2

Using rowid from data.table

library(data.table)
setDT(myd)[ ,num := rowid(status, id)]

-output

> myd
   id age status num
1:  2  12      A   1
2:  2  14      C   1
3:  2  16      B   1
4:  2  18      C   2
5:  3  11      C   1
6:  3  13      C   2
7:  3  14      B   1
8:  3  15      B   2
akrun
  • 874,273
  • 37
  • 540
  • 662
1
myd %>% group_by(status,id ) %>% mutate(num=row_number()) 
# A tibble: 8 x 4
# Groups:   status, id [5]
     id   age status   num
  <dbl> <dbl> <chr>  <int>
1     2    12 A          1
2     2    14 C          1
3     2    16 B          1
4     2    18 C          2
5     3    11 C          1
6     3    13 C          2
7     3    14 B          1
8     3    15 B          2
Daman deep
  • 631
  • 3
  • 14