按日期和唯一ID分组的7天总和

时间:2019-02-27 17:21:01

标签: r dplyr tidyr

我正在使用工作负载数据来计算3个指标-Daily7-Day rolling(过去7天的总和)28-Day Rolling Average(过去28天的总和/ 4)。

我已经可以用Daily进行计算,但是我需要7-Day rolling28-Day Rolling Average并遇到了一些麻烦。我每个日期都有17个唯一的ID(日期从2018-08-092018-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是该特定唯一ID的最后7个日期的总和。

1 个答案:

答案 0 :(得分:1)

rollsum的帮助文件说:

  

rollmean和rollsum的默认方法不处理输入   包含NA。

使用rollapplyr(x, width, sum, na.rm = TRUE)从总和中排除输入中的NA。注意r末尾的rollapplyr,以指定右对齐。

还请注意,如果您想在开头加上部分和而不是NA,则可以使用partial=TRUE参数。