df <- structure(list(date = structure(c(17591, 17592, 17593, 17594,
17595, 17596, 17597, 17598, 17599, 17600, 17601, 17602, 17603,
17604, 17605, 17606, 17607, 17608, 17609, 17610, 17611, 17612,
17613, 17614), class = "Date"),
sample = c(30, NA, NA, NA, NA,
20, NA, NA, 40, NA, NA, NA, NA, NA, 35, NA, NA, 15, NA, NA, NA,
NA, 5, NA),
applied = c(NA, NA, 10, NA, NA, NA, NA, 10, NA, NA,
15, NA, NA, NA, 10, NA, NA, NA, 15, NA, NA, 10, NA, NA),
estimate = c(30,29, 38, 37, 36, 20, 19, 28, 40, 39, 53, 52, 51, 50, 35, 34, 33,
15, 29, 28, 27, 36, 5, 4)), class = "data.frame",
row.names = c(NA,-24L))
require(dplyr)
## create asubset without "estimate"
df2 <- df[,1:3]
df2 %>% arrange(date) %>%
mutate(sample_id = cumsum(!is.na(sample))) %>% #create an id for each sample
mutate(applied = if_else(is.na(applied),0, applied)) %>% # turn NA applied to 0
mutate(applied = if_else(is.na(sample), applied -1, applied)) %>% # turn applied to -1 when sample is NA
mutate(estimate0 = if_else(is.na(sample), 0, sample)) %>% # duplicate sample column
mutate(estimate0 = estimate0 + applied) %>% # horizontal calculation sample + applied
group_by(sample_id) %>% # group by to restrict the cumsum
arrange(date) %>% # necessary order for the cumsum
mutate(estimate = cumsum(estimate0)) %>% # cumsum
ungroup %>%
select(date, sample, applied, estimate) %>%
print(n = 24)
# A tibble: 24 x 4
date sample applied estimate
<date> <dbl> <dbl> <dbl>
1 2018-03-01 30 0 30
2 2018-03-02 NA -1 29
3 2018-03-03 NA 9 38
4 2018-03-04 NA -1 37
5 2018-03-05 NA -1 36
6 2018-03-06 20 0 20
7 2018-03-07 NA -1 19
8 2018-03-08 NA 9 28
9 2018-03-09 40 0 40
10 2018-03-10 NA -1 39
11 2018-03-11 NA 14 53
12 2018-03-12 NA -1 52
13 2018-03-13 NA -1 51
14 2018-03-14 NA -1 50
15 2018-03-15 35 10 45
16 2018-03-16 NA -1 44
17 2018-03-17 NA -1 43
18 2018-03-18 15 0 15
19 2018-03-19 NA 14 29
20 2018-03-20 NA -1 28
21 2018-03-21 NA -1 27
22 2018-03-22 NA 9 36
23 2018-03-23 5 0 5
24 2018-03-24 NA -1 4