2017-02-23 12 views
0

我有一個數據框,dates,其中包含日期列表。我試圖製作一個列表,dates$t2,分成幾周。 (即每個連續一週內的日期有多少)。如何將日期列表分爲幾周,並繪製每週的計數直方圖

我希望每個分箱周都有一個格式爲「例如」的標籤。 11月11日,11月,11月,...,範圍限制在列表中的「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) 

到目前爲止,我認爲,這麼好。 Dataframe看起來像這樣:

> 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,任何幫助非常感謝,謝謝!

回答

0

你可以做一個星期的日曆包含每年每個星期的第一天:

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)) 
+0

這很好,謝謝@HubertL!爲了完整起見(對於R的其他混淆民俗...),您可以在ggplot中添加以下行來旋轉x標籤,如果它們重疊且不可讀: '+ theme(axis.text.x = element_text(angle = 90))' – monkeytennis

+0

已添加,thx @monkeytennis – HubertL

相關問題