Using data.table, you can do it
library(data.table)
set.seed(123)
seq.Date(as.Date('2016-09-01'),as.Date('2016-09-30'),by = 'days')
sample(1:10,size=30,replace = TRUE)
c(rep(0,3),rep(1,2),rep(0,1),rep(1,5),rep(0,6),rep(1,3),rep(0,5),rep(1,5))
df <- data.table(Date = seq.Date(as.Date('2016-09-01'),as.Date('2016-09-30'),by = 'days'),
value = sample(1:10,size=30,replace = TRUE),
signal = c(rep(0,3),rep(1,2),rep(0,1),rep(1,5),rep(0,6),rep(1,3),rep(0,5),rep(1,5)))
df[, pl := cumsum(value)*signal, by = .(signal, rleid(signal))]
Since dplyrI do not know any equivalent data.table::rleid, so it uses it:
library(dplyr)
df %>%
group_by(id = data.table::rleidv(signal)) %>%
mutate(pl = cumsum(value) * signal) %>%
select(-id) %>%
head(12)
#> Adding missing grouping variables: `id`
#> Source: local data frame [12 x 5]
#> Groups: id [5]
#>
#> id Date value signal pl
#> <int> <date> <int> <dbl> <dbl>
#> 1 1 2016-09-01 10 0 0
#> 2 1 2016-09-02 10 0 0
#> 3 1 2016-09-03 7 0 0
#> 4 2 2016-09-04 8 1 8
#> 5 2 2016-09-05 1 1 9
#> 6 3 2016-09-06 5 0 0
#> 7 4 2016-09-07 8 1 8
#> 8 4 2016-09-08 3 1 11
#> 9 4 2016-09-09 4 1 15
#> 10 4 2016-09-10 3 1 18
#> 11 4 2016-09-11 2 1 20
#> 12 5 2016-09-12 5 0 0