Скользящая 7-дневная сумма, сгруппированная по дате и уникальному идентификатору

Я использую данные о рабочей нагрузке для вычисления 3 показателей - Daily, 7-Day rolling (сумма за последние 7 дней) 28-Day Rolling Average (сумма за последние 28 дней / 4).

Я смог вычислить Daily, но мне нужны мои 7-Day rolling и 28-Day Rolling Average, и у меня возникли проблемы. У меня есть 17 уникальных идентификаторов для каждой даты (диапазон дат от 2018-08-09 до 2018-12-15).

library(dplyr)
library(tidyr)
library(tidyverse)
library(zoo)

Post_Practice <- read.csv("post.csv", stringsAsFactors = FALSE)
Post_Data <- Post_Practice[, 1:3]
DailyLoad <- Post_Data %>% 
  group_by(Date, Name) %>% 
  transmute(Daily = sum(DayLoad)) %>% 
  distinct(Date, Name, .keep_all = TRUE) %>% 
  mutate('7-day' = rollapply(Daily, 7, sum, na.rm = TRUE, partial = TRUE))

Вход:

  Date              Name       DayLoad
2018-08-09       Athlete 1    273.92000
2018-08-09       Athlete 2    351.16000
2018-08-09       Athlete 3    307.97000
2018-08-09       Athlete 1    434.20000
2018-08-09       Athlete 2    605.92000
2018-08-09       Athlete 3    432.87000

Ввод выглядит так до 2018-12-15. Некоторые даты содержат несколько данных (как указано выше), а некоторые содержат только одну запись.

Этот код создает столбец 7-day, но показывает тот же номер, что и Daily, то есть:

   Date       Name                Daily   7-day
   <chr>      <chr>               <dbl>   <dbl>
 1 2018-08-09 Athlete 1           708.    708.
 2 2018-08-09 Athlete 2           957.    957.
 3 2018-08-09 Athlete 3           741.    741.

Цель состоит в том, чтобы финальный стол (то есть через 7 дней) выглядел следующим образом:

   Date       Name                Daily   7-day
   <chr>      <chr>               <dbl>   <dbl>
 1 2018-08-15 Athlete 1           413.    3693.
 2 2018-08-15 Athlete 2           502.    4348.
 3 2018-08-15 Athlete 3           490.    4007.

Где Daily - это сумма этой конкретной даты, а 7-Day - сумма последних 7 дат для этого конкретного уникального идентификатора.


person Tyler Friedrich    schedule 27.02.2019    source источник
comment
Мне это непонятно. Откуда взялся 2018-08-09? Три - это не семь свиданий, так что же означает совокупная сумма семи дней? Как числа в ожидаемом выходе соотносятся с вводом?   -  person G. Grothendieck    schedule 28.02.2019


Ответы (1)


В файле справки для rollsum говорится:

Методы rollmean и rollsum по умолчанию не обрабатывают входные данные, содержащие NA.

Используйте rollapplyr(x, width, sum, na.rm = TRUE), чтобы исключить NA во входных данных из суммы. Обратите внимание на r в конце rollapplyr, чтобы указать выравнивание по правому краю.

Также обратите внимание, что аргумент partial=TRUE может использоваться, если вам нужны частичные суммы в начале, а не НП.

person G. Grothendieck    schedule 27.02.2019
comment
Отредактированный код выше для отображения с использованием rollapplyr. Мой столбец 7-day теперь просто показывает то же значение, что и столбец Daily, вместо 7-дневной суммы для этого человека - person Tyler Friedrich; 27.02.2019
comment
Вопрос показывает только вывод, но не ввод. Все вопросы к SO должны содержать полные минимальные и проверяемые примеры кода. Возможно, ошибка в том, что вы сгруппировали по дате, так что в каждой группе есть только одна строка. - person G. Grothendieck; 27.02.2019
comment
Надеюсь, мои правки выше более полны. По сути, каждая отдельная дата будет иметь свои собственные данные, но я борюсь с поиском 7-дневной скользящей суммы для каждого спортсмена. - person Tyler Friedrich; 27.02.2019