按组反向累计和

reverse cumulative sum by group

这是我的数据:

ID<-rep(1:5, length.out=15 )
    b<-cumsum(1:10)
    c<-cumsum(1:10)*2
    bc<-c(b,c)
    e<-cbind(ID,bc)
    e<-as.data.frame(e)
    e$ID<-as.factor(e$ID)
    

我想要第三列,其中包含从中得出累积和的值。这是预期的结果。 我知道我需要按 ID 分组,但不知道要使用哪个函数来做我想做的事。

f<-e %>% group_by(ID) %>% mutate(num=




  ID bc num
1  1  1 1
2  2  3 2
3  3  6 3
4  4 10 4
5  5 15 5
6  1  2 2

我认为您正在寻找 diff,但您没有正确分组。您似乎想对 ID 1 到 5 的每个循环执行操作,因此您需要标记每个 cycle 并按其分组:

e %>%
  mutate(group = cumsum(c(-1, diff(as.numeric(as.character(ID)))) < 0)) %>%
  group_by(group) %>%
  mutate(num = diff(c(0, bc))) %>%
  select(-group)
#> # A tibble: 20 x 4
#> # Groups:   group [4]
#>    group ID       bc   num
#>    <int> <fct> <dbl> <dbl>
#>  1     1 1         1     1
#>  2     1 2         3     2
#>  3     1 3         6     3
#>  4     1 4        10     4
#>  5     1 5        15     5
#>  6     2 1        21    21
#>  7     2 2        28     7
#>  8     2 3        36     8
#>  9     2 4        45     9
#> 10     2 5        55    10
#> 11     3 1         2     2
#> 12     3 2         6     4
#> 13     3 3        12     6
#> 14     3 4        20     8
#> 15     3 5        30    10
#> 16     4 1        42    42
#> 17     4 2        56    14
#> 18     4 3        72    16
#> 19     4 4        90    18
#> 20     4 5       110    20

我们也可以

library(dplyr)
e %>%
   group_by(grp = cumsum(ID == 1)) %>% 
   mutate(num = coalesce(bc - lag(bc), bc)) %>%
   ungroup %>%
   select(-grp)

-输出

# A tibble: 20 x 3
#      ID    bc   num
#   <dbl> <dbl> <dbl>
# 1     1     1     1
# 2     2     3     2
# 3     3     6     3
# 4     4    10     4
# 5     5    15     5
# 6     1    21    21
# 7     2    28     7
# 8     3    36     8
# 9     4    45     9
#10     5    55    10
#11     1     2     2
#12     2     6     4
#13     3    12     6
#14     4    20     8
#15     5    30    10
#16     1    42    42
#17     2    56    14
#18     3    72    16
#19     4    90    18
#20     5   110    20