Cumsum с данными панели: разные даты начала - PullRequest
0 голосов
/ 30 апреля 2019

Попытка найти сумму по различным типам контрактов.Каждый из них имеет уникальную дату остановки (т.е. доставки) с ожидаемой доставкой в ​​течение нескольких месяцев до этой даты.Требуется рассчитать сумму всех ожидаемых поставок до фактической даты поставки.

По некоторым причинам функция cumsum / rollsum не работает.Я пробовал обе версии DT и dplyr, но обе не удалось.

Вот упрощенные данные для проблемы, над которой я работаю.

df <- data.frame(report_year = c(rep(2017,10), rep(2018,10)), 
       report_month = c(seq(1,5,1), seq(2,6,1), seq(3,7,1), seq(2,6,1)),
       delivery_year = c(rep(2017,10), rep(2018,10)), 
       delivery_month = c(rep(5,5),rep(6,5), rep(7,5), rep(6,5)),
       sum = c(rep(seq(100,500,100), 4)),
       cumsum = c(rep(c(100,300,600,1000,1500),4)))

Первые 5 столбцов - это то, что у меня сейчас есть.

Я пытаюсь получить последний столбец (т.е. cumsum)

Возможно, я что-то делаю не так.Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Вопрос конкретно не определял, какие столбцы группировки использовать, поэтому, возможно, придется немного изменить их в зависимости от того, что вы хотите, но это делает это без каких-либо пакетов:

df$cumsum <- NULL  # remove the result from df shown in question
transform(df, cumsum = ave(sum, delivery_year, delivery_month, FUN = cumsum))

Обратите внимание, что хотя вышеприведенное работаетВы можете столкнуться с некоторыми проблемами, используя sum и cumsum в качестве имен столбцов из-за путаницы с функциями с одинаковыми именами, так что вы можете захотеть использовать, скажем, Sum и Cumsum.Например, если вы не обнуляете cumsum, как мы делали выше, тогда FUN = cumsum подумает, что вы хотите применить столбец cumsum, который не является функцией.

0 голосов
/ 30 апреля 2019

Использование упорядочение и видоизменение

# Import library
library(dplyr)

# Calculating cumsum
df %>%
  group_by(delivery_year, delivery_month) %>%
  arrange(sum) %>% 
  mutate(cs = cumsum(sum))

выход

   report_year report_month delivery_year delivery_month   sum cumsum    cs
         <dbl>        <dbl>         <dbl>          <dbl> <dbl>  <dbl> <dbl>
 1        2017            1          2017              5   100    100   100
 2        2017            2          2017              6   100    100   100
 3        2018            3          2018              7   100    100   100
 4        2018            2          2018              6   100    100   100
 5        2017            2          2017              5   200    300   300
 6        2017            3          2017              6   200    300   300
 7        2018            4          2018              7   200    300   300
...