Soma cumulativa dplyr / R com reset
Eu gostaria de gerar somas cumulativas com uma redefinição se a soma "atual" exceder algum limite, usando dplyr. No abaixo, eu quero cumsum sobre 'a'.
library(dplyr)
library(tibble)
tib <- tibble(
t = c(1,2,3,4,5,6),
a = c(2,3,1,2,2,3)
)
# what I want
## thresh = 5
# A tibble: 6 x 4
# t a g c
# <dbl> <dbl> <int> <dbl>
# 1 1.00 2.00 0 2.00
# 2 2.00 3.00 0 5.00
# 3 3.00 1.00 1 1.00
# 4 4.00 2.00 1 3.00
# 5 5.00 2.00 1 5.00
# 6 6.00 3.00 2 3.00
# what I want
## thresh = 4
# A tibble: 6 x 4
# t a g c
# <dbl> <dbl> <int> <dbl>
# 1 1.00 2.00 0 2.00
# 2 2.00 3.00 0 5.00
# 3 3.00 1.00 1 1.00
# 4 4.00 2.00 1 3.00
# 5 5.00 2.00 1 5.00
# 6 6.00 3.00 2 3.00
# what I want
## thresh = 6
# A tibble: 6 x 4
# t a g c
# <dbl> <dbl> <int> <dbl>
# 1 1.00 2.00 0 2.00
# 2 2.00 3.00 0 5.00
# 3 3.00 1.00 0 6.00
# 4 4.00 2.00 1 2.00
# 5 5.00 2.00 1 4.00
# 6 6.00 3.00 1 7.00
Examinei muitas das perguntas semelhantes aqui (comoredefinindo cumsum se o valor for negativo em r) e conseguiu o que eu esperava que estivesse próximo, mas não.
Eu tentei variantes de
thresh <-5
tib %>%
group_by(g = cumsum(lag(cumsum(a) >= thresh, default = FALSE))) %>%
mutate(c = cumsum(a)) %>%
ungroup()
que retorna
# A tibble: 6 x 4
t a g c
<dbl> <dbl> <int> <dbl>
1 1.00 2.00 0 2.00
2 2.00 3.00 0 5.00
3 3.00 1.00 1 1.00
4 4.00 2.00 2 2.00
5 5.00 2.00 3 2.00
6 6.00 3.00 4 3.00
Você pode ver que o "grupo" não está sendo redefinido após a primeira vez.