Search code examples
rdataframecumulative-frequency

Cumulative count of blocks of 1 with 0 separators in a binary vector in R


I have a data frame with a binary vector that I want to do a cumulative count of. However I would like to count the 'groups of 1's' rather than each individual 1 and create a new vector of this count while retaining the 0 separating values. i.e.

df1 <- data.frame(c(0,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1)

n   bin
1    0
2    1
3    1
4    1
5    1
6    0
7    0
8    0
9    1
10   1
11   1
12   1
13   1
14   0
15   0
16   0
17   1
18   1
19   1 

becomes

n   bin cumul
1    0     0
2    1     1
3    1     1
4    1     1
5    1     1
6    0     0
7    0     0
8    0     0
9    1     2
10   1     2
11   1     2
12   1     2
13   1     2
14   0     0
15   0     0
16   0     0
17   1     3
18   1     3
19   1     3

how do I go about this?


Solution

  • You can use the rleid function from package data.table:

    df1 <- data.frame(bin = c(0,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1))
    library(data.table)
    setDT(df1)
    df1[, cumul := rleid(bin)]
    df1[bin == 0, cumul := 0]                  
    df1[bin == 1, cumul := rleid(cumul)]  
    #    bin cumul
    # 1:   0     0
    # 2:   1     1
    # 3:   1     1
    # 4:   1     1
    # 5:   1     1
    # 6:   0     0
    # 7:   0     0
    # 8:   0     0
    # 9:   1     2
    #10:   1     2
    #11:   1     2
    #12:   1     2
    #13:   1     2
    #14:   0     0
    #15:   0     0
    #16:   0     0
    #17:   1     3
    #18:   1     3
    #19:   1     3