This question already has answers here:
Cumsum with reset when 0 is encountered and by groups

(2 个回答)



Cumulative sum that resets when 0 is encountered

(4 个回答)


3年前关闭。




我有以下数据框
    x          y    count
1   1 2018-02-24 4.031540
2   2 2018-02-25 5.244303
3   3 2018-02-26 5.441465
4  NA 2018-02-27 4.164104
5   5 2018-02-28 5.172919
6   6 2018-03-01 5.591410
7   7 2018-03-02 4.691716
8   8 2018-03-03 5.465360
9   9 2018-03-04 3.269378
10 NA 2018-03-05 5.300679
11 11 2018-03-06 5.489664
12 12 2018-03-07 4.423334
13 13 2018-03-08 3.808764
14 14 2018-03-09 6.450136
15 15 2018-03-10 5.541785
16 16 2018-03-11 4.762889
17 17 2018-03-12 5.511649
18 18 2018-03-13 6.795386
19 19 2018-03-14 6.615762
20 20 2018-03-15 4.749151

我想获取计数列的 cumsum ,但我希望 cumsum 在 x 值为 NA 时重新启动。我尝试了以下方法:
df$cum_sum <- ifelse(is.na(df$x) == FALSE, cumsum(df$count), 0)
    x          y    count    cum_sum
1   1 2018-02-24 4.031540   4.031540
2   2 2018-02-25 5.244303   9.275843
3   3 2018-02-26 5.441465  14.717308
4  NA 2018-02-27 4.164104   0.000000
5   5 2018-02-28 5.172919  24.054331
6   6 2018-03-01 5.591410  29.645741
7   7 2018-03-02 4.691716  34.337458
8   8 2018-03-03 5.465360  39.802817
9   9 2018-03-04 3.269378  43.072195
10 NA 2018-03-05 5.300679   0.000000
11 11 2018-03-06 5.489664  53.862538
12 12 2018-03-07 4.423334  58.285871
13 13 2018-03-08 3.808764  62.094635
14 14 2018-03-09 6.450136  68.544771
15 15 2018-03-10 5.541785  74.086556
16 16 2018-03-11 4.762889  78.849445
17 17 2018-03-12 5.511649  84.361094
18 18 2018-03-13 6.795386  91.156480
19 19 2018-03-14 6.615762  97.772242
20 20 2018-03-15 4.749151 102.521394

结果是 cum_sum 列在 NA 值处为 0,但 cumsum 不会重置。我怎样才能解决这个问题?

最佳答案

一个可能的解决方案:

dat$cum_sum <- ave(dat$count, cumsum(is.na(dat$x)), FUN = cumsum)

这使:



或使用 dplyr :
library(dplyr)
dat %>%
  group_by(grp = cumsum(is.na(x))) %>%
  mutate(cum_sum = cumsum(count)) %>%
  ungroup() %>%
  select(-grp)

关于r - Cumsum 重置为特定值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48953352/

10-11 06:55