How to Perform Cumulative Sum in R?

This is R code to calculate cumulative sum.

1) Data created

treatment=rep(c("Cultivar A", "Cultivar B", "Cultivar C", "Cultivar D", "Cultivar E"), each=3)
rep=rep(c("I", "II", "III"), time=5)
yield=c(10, 11, 21, 13, 23, 23, 13, 13, 5, 33, 21, 13, 42, 12, 13)
nitrogen=c(500,450,482,485,770,158,565,985,458,636,965,458,565,985,458)
dataA=data.frame(treatment, rep, yield, nitrogen)

    treatment rep yield nitrogen
1  Cultivar A   I    10      500
2  Cultivar A  II    11      450
3  Cultivar A III    21      482
4  Cultivar B   I    13      485
5  Cultivar B  II    23      770
6  Cultivar B III    23      158
7  Cultivar C   I    13      565
8  Cultivar C  II    13      985
9  Cultivar C III     5      458
10 Cultivar D   I    33      636
11 Cultivar D  II    21      965
12 Cultivar D III    13      458
13 Cultivar E   I    42      565
14 Cultivar E  II    12      985
15 Cultivar E III    13      458

2) Cumulative Sum per group

if(!require(dplyr)) install.packages("dplyr")
library(dplyr)

dataB= data.frame(dataA %>%
       group_by(treatment) %>%
       mutate(yield_accu=cumsum(yield)))

dataC= data.frame(dataB %>%
       group_by(treatment) %>%
       mutate(nitrogen_accu=cumsum(nitrogen)))

dataC
    treatment rep yield nitrogen <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">yield_accu nitrogen_accu</mark>
1  Cultivar A   I    10      500         <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">10           500</mark>
2  Cultivar A  II    11      450         <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">21           950</mark>
3  Cultivar A III    21      482         <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">42          1432</mark>
4  Cultivar B   I    13      485         <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">13           485</mark>
5  Cultivar B  II    23      770         <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">36          1255</mark>
6  Cultivar B III    23      158         <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">59          1413</mark>
7  Cultivar C   I    13      565         <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">13           565</mark>
8  Cultivar C  II    13      985         <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">26          1550</mark>
9  Cultivar C III     5      458         <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">31          2008</mark>
10 Cultivar D   I    33      636         <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">33           636</mark>
11 Cultivar D  II    21      965         <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">54          1601</mark>
12 Cultivar D III    13      458         <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">67          2059</mark>
13 Cultivar E   I    42      565         <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">42           565</mark>
14 Cultivar E  II    12      985        <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color"> 54          1550</mark>
15 Cultivar E III    13      458         <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">67          2008</mark>

3) datacume() function

To make this process easier, I developed an R function, datacume(). For details, please read the post below.

1) Install the function

if(!require(remotes)) install.packages("remotes")
if (!requireNamespace("datacume", quietly = TRUE)) {
  remotes::install_github("agronomy4future/datacume", force= TRUE)
}
library(remotes)
library(datacume)

2) Run the code

if(!require(dplyr)) install.packages("dplyr")
library(dplyr)

dataD= datacume(
  data= dataA,
  group_vars= c("treatment"),
  time_var= rep,
  response_vars= c("yield","nitrogen"))

dataD
   treatment  rep   yield nitrogen Cumulative_yield Cumulative_nitrogen
 1 Cultivar A I        10      500               10                 500
 2 Cultivar A II       11      450               21                 950
 3 Cultivar A III      21      482               42                1432
 4 Cultivar B I        13      485               13                 485
 5 Cultivar B II       23      770               36                1255
 6 Cultivar B III      23      158               59                1413
 7 Cultivar C I        13      565               13                 565
 8 Cultivar C II       13      985               26                1550
 9 Cultivar C III       5      458               31                2008
10 Cultivar D I        33      636               33                 636
11 Cultivar D II       21      965               54                1601
12 Cultivar D III      13      458               67                2059
13 Cultivar E I        42      565               42                 565
14 Cultivar E II       12      985               54                1550
15 Cultivar E III      13      458               67                2008