4

I have a data frame with 2 columns like this:

> data.frame(x=1:10, y=c(0,0,0,1,1,0,0,1,0,1))
    x y
1   1 0
2   2 0
3   3 0
4   4 1
5   5 1
6   6 0
7   7 0
8   8 1
9   9 0
10 10 1

and I want to get the cumulative sum of column x (cumsum(df$x)), but the sum should be reset after a 1 appears in column y. This is the result I am looking for:

1
3
6
10
5
6
13
21
9
19

How can I achieve this in R?

Sven Hohenstein
  • 80,497
  • 17
  • 145
  • 168
SKp
  • 55
  • 5

2 Answers2

4

You can achieve that by using ave:

ave(d$x,c(0,cumsum(d$y[-nrow(d)])),FUN=cumsum)

#  [1]  1  3  6 10  5  6 13 21  9 19
Marat Talipov
  • 13,064
  • 5
  • 34
  • 53
3

A data.table method using shift

 library(data.table) #devel version `data.table_1.9.5` 
 setDT(d)[, cumsum(x), by = cumsum(shift(y, fill=0))]$V1
 #[1]  1  3  6 10  5  6 13 21  9 19
Arun
  • 116,683
  • 26
  • 284
  • 387
akrun
  • 874,273
  • 37
  • 540
  • 662