Question

I have a dataframe with many rows, but the structure looks like this:

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

I would need to add a counter as a third column. It should count the cumulative cells that contains zero until it set again to zero once the value 1 is encountered. The result should look like this:

year factor count
1    0      0
2    0      1
3    0      2
4    0      3
5    0      4
6    0      5
7    0      6
8    0      7
9    1      0
10   0      1
11   0      2
12   0      3
13   0      4
14   0      5
15   0      6
16   0      7
17   1      0
18   0      1
19   0      2
20   0      3

I would be glad to do it in a quick way, avoiding loops, since I have to do the operations for hundreds of files.

You can copy my dataframe, pasting the dataframe in "..." here:

dt <- read.table( text="...", , header = TRUE )
Was it helpful?

Solution

Perhaps a solution like this with ave would work for you:

A <- cumsum(dt$factor)
ave(A, A, FUN = seq_along) - 1
#  [1] 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3

Original answer:

(Missed that the first value was supposed to be "0". Oops.)

x <- rle(dt$factor == 1)
y <- sequence(x$lengths)
y[dt$factor == 1] <- 0
y
#  [1] 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 0 1 2 3
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top