将每日数据汇总到每周,直到今天结束

时间:2020-05-20 20:36:50

标签: r time-series

我目前正在构建一些与covid相关的数据的图表....我的脚本退出并下载最新数据,然后从那里下载。我结束时看起来像这样的数据框

head(NMdata)

    Date state positiveIncrease totalTestResultsIncrease
1 2020-05-19    NM              158                     4367
2 2020-05-18    NM               81                     4669
3 2020-05-17    NM              195                     4126
4 2020-05-16    NM              159                     4857
5 2020-05-15    NM              139                     4590
6 2020-05-14    NM              152                     4722

我一直在使用tq_transmute中的tidyquant函数来汇总每周数据。

NMweeklyPos <- NMdata %>% tq_transmute(select = positiveIncrease, mutate_fun = apply.weekly, FUN=sum)

这有效,但它在一年中的某周汇总,而周几从星期日开始。

head(NMweeklyPos)

Date                positiveIncrease
  <dttm>                         <int>
1 2020-03-08 00:00:00                0
2 2020-03-15 00:00:00               13
3 2020-03-22 00:00:00               44
4 2020-03-29 00:00:00              180
5 2020-04-05 00:00:00              306
6 2020-04-12 00:00:00              631

例如,如果我今天运行它(恰好是星期三),我的最后输入是部分星期,其中星期一,星期二,星期三。

tail(NMweeklyPos)

 Date                positiveIncrease
  <dttm>                         <int>
1 2020-04-19 00:00:00              624
2 2020-04-26 00:00:00              862
3 2020-05-03 00:00:00             1072
4 2020-05-10 00:00:00             1046
5 2020-05-17 00:00:00             1079
6 2020-05-19 00:00:00              239

出于我的图表目的,这只是一个很小的值,所以我一直在末尾丢弃部分星期,但这意味着我要丢弃最新数据。

我宁愿从数据集的开头扔掉一个星期,让聚合自动使用在脚本运行的任何一天结束的几周。因此,如果我今天(星期三)运行它,它将在截至周三的几周进行汇总,这样我便可以包含最新的数据...我可以从数据开始删除部分的一周。但是明天它将选择星期四等结束的几周,等等。我不想对结束日进行硬编码并每次都进行更改。

我该如何实现?

1 个答案:

答案 0 :(得分:2)

使用lubridate,以下代码将查找星期几,并将该天定义为每周的下限。

希望这会有所帮助!

library(lubridate)
library(dplyr)

end = as.Date("2020-04-14")
data = data.frame(
  date = seq.Date(as.Date("2020-01-01"), end, by = "day"),
  val = 1
)

# get the day of the week
weekday = wday(end)

# using the floor_date function we can use todays date to determine what day of the week will be our floor
data%>%
  mutate(week = floor_date(date, "week", week_start = weekday))%>%
  group_by(week)%>%
  summarise(total = sum(val))