r - dplyr/R 带复位的累积总和

标签 r dplyr

如果“当前”总和超过某个阈值,我想使用 dplyr 生成带有重置的累积总和。在下面,我想对'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

我在这里检查了许多类似的问题(例如 resetting cumsum if value goes to negative in r )并得到了我希望的结果,但没有。

我试过的变种
thresh <-5
tib %>%
  group_by(g = cumsum(lag(cumsum(a) >= thresh, default = FALSE))) %>%
  mutate(c = cumsum(a)) %>%
  ungroup()

返回
# 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

您可以看到“组”在第一次之后没有被重置。

最佳答案

我想你可以用 accumulate()在这里提供帮助。而且我还制作了一个包装函数来用于不同的阈值

sum_reset_at <- function(thresh) {
  function(x) {
    accumulate(x, ~if_else(.x>=thresh, .y, .x+.y))
  }  
}

tib %>% mutate(c = sum_reset_at(5)(a))
#       t     a     c
#   <dbl> <dbl> <dbl>
# 1     1     2     2
# 2     2     3     5
# 3     3     1     1
# 4     4     2     3
# 5     5     2     5
# 6     6     3     3
tib %>% mutate(c = sum_reset_at(4)(a))
#       t     a     c
#   <dbl> <dbl> <dbl>
# 1     1     2     2
# 2     2     3     5
# 3     3     1     1
# 4     4     2     3
# 5     5     2     5
# 6     6     3     3
tib %>% mutate(c = sum_reset_at(6)(a))
#       t     a     c
#   <dbl> <dbl> <dbl>
# 1     1     2     2
# 2     2     3     5
# 3     3     1     6
# 4     4     2     2
# 5     5     2     4
# 6     6     3     7

关于r - dplyr/R 带复位的累积总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49076769/

相关文章:

r - 提取交互式图中鼠标单击的确切坐标

r - 如何按数字而不是名称使用特征来拟合模型

R data.table 选择组 block 中的前一行

r - 在 R 编程中对数据帧中的列中的值进行计数

r - dplyr中的字符串操作/聚合

使用数据帧上的循环将 R 中的 NA 替换为 0

r - 总结后如何考虑组内更大的日期

r - 使用列表作为 dplyr::case_when 的结果时丢失名称

r - 从 tibble json 列中提取键值对并将它们取消嵌套到不同的行中

r - 连接多个数据框时使用数据框名称作为后缀