Я хотел бы рассчитать ежемесячные некумулятивные промежуточные итоги для моего фрейма данных (df).
"date" "id" "change"
2010-01-01 1 NA
2010-01-07 2 3
2010-01-15 2 -1
2010-02-01 1 NA
2010-02-04 2 7
2010-02-22 2 -2
2010-02-26 2 4
2010-03-01 1 NA
2010-03-14 2 -4
2010-04-01 1 NA
Новый период начинается в первый день нового месяца. Столбец «id» служит в качестве переменной группировки для начала нового периода (== 1) и наблюдений в течение периода (== 2). Цель состоит в том, чтобы суммировать все изменения в течение месяца и затем перезапустить на 0 для следующего периода. Вывод должен храниться в дополнительном столбце df.
Вот воспроизводимый пример для моего фрейма данных:
require(dplyr)
require(tidyr)
require(lubridate)
date <- ymd(c("2010-01-01","2010-01-07","2010-01-15","2010-02-01","2010-02-04","2010-02-22","2010-02-26","2010-03-01","2010-03-14","2010-04-01"))
df <- data.frame(date)
df$id <- as.numeric((c(1,2,2,1,2,2,2,1,2,1)))
df$change <- c(NA,3,-1,NA,7,-2,4,NA,-4,NA)
Что я пытался сделать:
df <- df %>%
group_by(id) %>%
mutate(total = cumsum(change)) %>%
ungroup() %>%
fill(total, .direction = "down") %>%
filter(id == 1)
Что приводит к такому выводу:
"date" "id" "change" "total"
2010-01-01 1 NA NA
2010-02-01 1 NA 2
2010-03-01 1 NA 11
2010-04-01 1 NA 7
Проблема заключается в функции cumsum, которая накапливает все предыдущие значения из группы и не перезапускается с нуля в течение нового периода.
Желаемый результат выглядит следующим образом:
"date" "id" "change" "total"
2010-01-01 1 NA NA
2010-02-01 1 NA 2
2010-03-01 1 NA 9
2010-04-01 1 NA -4
Строки с «id» == 1 показывают сумму изменений для всех предыдущих столбцов с «id» == 2, начиная с 0 для каждого периода. Существует ли конкретная команда для этого типа проблемы? Может ли кто-нибудь предоставить исправленную альтернативу коду выше?