0

I would like to create a cumulative sum over years, always go over rows, and add additional items.

# TEST
data <- data.frame(
  `Delivery Year` = c('1976','1977','1978','1979'),
  `Year.1976` = c(10,3,8,0),
  `Year.1977` = c(5,0,5,0),
  `Year.1978` = c(10,10,0,0),
  `Year.1979` = c(13,0,0,14)
)

data


# DESIRED
data <- data.frame(
  `Delivery Year` = c('1976','1977','1978','1979'),
  `Year.1976` = c(10,3,8,0),
  `Year.1977` = c(15,3,13,0),
  `Year.1978` = c(25,13,13,0),
  `Year.1979` = c(38,13,13,14)
)

data

Jaroslav Kotrba
  • 283
  • 1
  • 14

1 Answers1

1

Does this work:

library(dplyr)
library(tidyr)

data %>% pivot_longer(-1) %>% group_by(Delivery.Year) %>% 
  mutate(value = cumsum(value)) %>% 
    pivot_wider(Delivery.Year, names_from = name, values_from = value)

# A tibble: 4 x 5
# Groups:   Delivery.Year [4]
  Delivery.Year Year.1976 Year.1977 Year.1978 Year.1979
  <chr>             <dbl>     <dbl>     <dbl>     <dbl>
1 1976                 10        15        25        38
2 1977                  3         3        13        13
3 1978                  8        13        13        13
4 1979                  0         0         0        14
Karthik S
  • 11,348
  • 2
  • 11
  • 25
  • Yes, this works for the test df, could you let me know how to do it when we will not take the column Delivery.Year into consideration? (For my full df) Thank you – Jaroslav Kotrba Nov 02 '21 at 11:06
  • You mean you don't want to be grouped by any column? If so, then you can just remove the `group_by(Delivery.Year)` part – Karthik S Nov 02 '21 at 11:40