Вы можете использовать accumulate
. Если Vol
(..2
) равно 0
, используйте предыдущий элемент (..1
), в противном случае используйте Vol/CumVol
(..3
)
library(tidyverse)
df %>%
group_by(Group) %>%
mutate(answer =
as.numeric(accumulate2(Vol, OI/CumVol, ~ if(..2 == 0) ..1 else ..3,
.init = 0)[-1]))
# # A tibble: 8 x 6
# # Groups: Group [2]
# Group Vol OI CumVol Rd answer
# <chr> <int> <int> <int> <dbl> <dbl>
# 1 2008-08-10 0 0 0 0 0
# 2 2008-08-10 100 100 100 1 1
# 3 2008-08-10 0 100 300 1 1
# 4 2008-08-10 0 100 400 1 1
# 5 2008-08-10 50 150 550 0.27 0.273
# 6 2009-12-10 0 150 0 0 0
# 7 2009-12-10 50 30 50 0.6 0.6
# 8 2009-12-10 0 20 50 0.6 0.6
Используемые данные
structure(list(Group = c("2008-08-10", "2008-08-10", "2008-08-10",
"2008-08-10", "2008-08-10", "2009-12-10", "2009-12-10", "2009-12-10"
), Vol = c(0L, 100L, 0L, 0L, 50L, 0L, 50L, 0L), OI = c(0L, 100L,
100L, 100L, 150L, 150L, 30L, 20L), CumVol = c(0L, 100L, 300L,
400L, 550L, 0L, 50L, 50L), Rd = c(0, 1, 1, 1, 0.27, 0, 0.6, 0.6
)), row.names = c(NA, -8L), class = "data.frame")