如何将日期列表分为几周,并绘制每周计数的直方图

How to bin list of dates into weeks, and plot histogram of count in each week

我有一个数据框 dates,其中包含日期列表。我正在尝试绘制其中一个列表 dates$t2 的图,并将其分成数周。 (即有多少日期落在每个连续的一周内。)

我希望每一周都有一个标签,格式如下11 月 1 日、11 月 8 日、...,范围限于列表中的 'minimimum' 和 'maximum'(最早和最晚)日期。

到目前为止,我已经创建了一个数据框,其中包含我想要分箱的日期列表,data$t2,以及一系列列(我假设!)我需要创建我的 x 标签:

library(lubridate)

dates$t1 <- c("24/07/2015", "12/08/2015", "10/08/2015", "05/09/2015", "20/09/2015", 
"23/09/2015", "07/09/2015", "04/11/2015", "03/11/2015", "14/10/2015", 
"08/10/2015", "14/09/2015", "02/10/2015", "28/09/2015", "23/10/2015", 
"02/11/2015", "28/11/2015", "06/12/2015", "10/12/2015", "08/12/2015", 
"07/12/2015", "03/12/2015", "21/11/2015", "02/12/2015", "12/12/2015", 
"28/12/2015", "13/01/2016", "14/01/2016", "03/01/2016", "24/01/2016"
)

dates$t1 <- dmy(dates$t1)
dates$t2 <- dates$t1 + years(1)
dates$day = day(dates$t2)
dates$week = isoweek(dates$t2)
dates$month = month(dates$t2, label = TRUE)
dates$year = year(dates$t2)

dates <- na.omit(dates)

到目前为止,我认为一切都很好。数据框如下所示:

> head(dates)
          t1         t2 day week month year
1 2015-07-24 2016-07-24  24   29   Jul 2016
2 2015-08-12 2016-08-12  12   32   Aug 2016
3 2015-08-10 2016-08-10  10   32   Aug 2016
4 2015-09-05 2016-09-05   5   36   Sep 2016
5 2015-09-20 2016-09-20  20   38   Sep 2016
6 2015-09-23 2016-09-23  23   38   Sep 2016

> str(dates)
'data.frame':   30 obs. of  6 variables:
 $ t1   : Date, format: "2015-07-24" "2015-08-12" "2015-08-10" "2015-09-05" ...
 $ t2   : Date, format: "2016-07-24" "2016-08-12" "2016-08-10" "2016-09-05" ...
 $ day  : int  24 12 10 5 20 23 7 4 3 14 ...
 $ week : int  29 32 32 36 38 38 36 44 44 41 ...
 $ month: Ord.factor w/ 12 levels "Jan"<"Feb"<"Mar"<..: 7 8 8 9 9 9 9 11 11 10 ...
 $ year : num  2016 2016 2016 2016 2016 ...
 - attr(*, "na.action")=Class 'omit'  Named int [1:18] 30 32 33 34 35 36 37 38 39 40 ...
  .. ..- attr(*, "names")= chr [1:18] "30" "32" "33" "34" ...

然而,当涉及到装箱和绘图时,我被卡住了。我被困在这一点上:

ggplot(dates, aes(x = week)) +
  geom_bar()

是否有人可以建议如何:

  1. 将 x 轴上的周数替换为日-月(例如 01-11 月)格式?
  2. 告诉 ggplot 周数跨越两个不同的年份,例如1-10 属于 2017 年初,而不是当前显示的 2016 年初。
  3. 将 x 轴范围设置为列表中最早和最晚的日期,而不是整年。

我对 R 还是很陌生,非常感谢任何帮助,谢谢!

您可以制作包含每年每个星期的第一个日期的周历:

library(dplyr)
data.frame(date=seq(as.Date("2015/1/1"), as.Date("2016/12/31"), by="day")) %>% 
  mutate(week=isoweek(date),year=year(date)) %>%
  group_by(year,week) %>% 
  summarise(weekdate=min(date)) -> week_calendar

然后将其与 data.frame

合并
dates <- merge(dates,week_calendar)

然后你可以用

绘图
library(ggplot2)
ggplot(dates, aes(x = weekdate)) +
  geom_bar()+
  scale_x_date(date_breaks = "1 week", date_labels = "%d-%b")+
  theme(axis.text.x = element_text(angle = 90))