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

Я использую данные рабочей нагрузки для вычисления 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 дат для этого конкретного уникального идентификатора.

1 Ответ

0 голосов
/ 27 февраля 2019

Файл справки для rollsum гласит:

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

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

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

...