Reputation: 55
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?
Upvotes: 4
Views: 1849
Reputation: 887981
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
Upvotes: 3
Reputation: 13314
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
Upvotes: 4