使用geom_bar表示平均值

时间:2015-10-08 02:53:05

标签: r ggplot2 facet geom-bar

我根据抵达前几天查看酒店房间的每日预订。

我认为预订的速度因星期几以及酒店A和酒店B而异,所以我想参加这些类别。但是,当我面对(7 x 2个酒店= 14个方面)时,它除以日期总数而不是每个类别中的日期数。也就是说,我有1400个独特的Date-Hotels,所以当我面对时,一切都被1400除以大约100。我希望我的代码除以97,103,101,取决于我在每个方面有多少酒店日期,所以我可以代表一个典型的"预订模式。

这是我目前的数据和代码:

DaysBeforeArrival=rep(1:5,8)
Hotel=rep(LETTERS[1:2],20)
DayOfWeek=c(rep(1,10),rep(2,10),rep(1,10),rep(2,10))
Dates=c(rep("Jan-1",10),rep("Jan-2",10),rep("Jan-8",10),rep("Jan-9",10))
bookings=(sample(1:40))
Date_HotelID=paste(Hotel,Dates,sep="-")
mydf=data.frame(DaysBeforeArrival,Hotel,DayOfWeek,Dates,bookings,Date_HotelID)


ggplot(mydf,aes(DaysBeforeArrival,bookings/length(unique(Date_HotelID)))+
geom_bar(stat=identity)  +
facet_grid(DayofWeek~HotelID)

谢谢!

2 个答案:

答案 0 :(得分:0)

这是你想要达到的目标吗?

library(ggplot2)
ggplot(mydf,aes(DaysBeforeArrival,bookings/length(unique(Date_HotelID))))+
         geom_bar(stat="identity")  + facet_wrap(~Hotel~DayOfWeek)

enter image description here

答案 1 :(得分:0)

一种方法是在制作图表之前简单地计算您想要绘制的内容。在您的情况下,您只需要为每个Date_HotelID / DayOfWeek组合计算唯一Hotel的数量,然后将bookings除以每个值{%}}行。

例如,我可以使用 dplyr 中的函数执行此操作。注意我使用n_distinctlength(unique(...)) dplyr 版本。

library(dplyr)
mydf3 = mydf %>%
    group_by(DayOfWeek, Hotel) %>% 
    mutate(book.speed = bookings/n_distinct(Date_HotelID))
mydf3

Source: local data frame [40 x 7]
Groups: DayOfWeek, Hotel [4]

   DaysBeforeArrival  Hotel DayOfWeek  Dates bookings Date_HotelID book.speed
               (int) (fctr)     (dbl) (fctr)    (int)       (fctr)      (dbl)
1                  1      A         1  Jan-1        5      A-Jan-1        2.5
2                  2      B         1  Jan-1       34      B-Jan-1       17.0
3                  3      A         1  Jan-1       20      A-Jan-1       10.0
4                  4      B         1  Jan-1       11      B-Jan-1        5.5
5                  5      A         1  Jan-1       13      A-Jan-1        6.5
6                  1      B         1  Jan-1       38      B-Jan-1       19.0
7                  2      A         1  Jan-1        7      A-Jan-1        3.5
8                  3      B         1  Jan-1       15      B-Jan-1        7.5
9                  4      A         1  Jan-1       22      A-Jan-1       11.0
10                 5      B         1  Jan-1       14      B-Jan-1        7.0
..               ...    ...       ...    ...      ...          ...        ...

只需使用计算出的数据制作图表。

ggplot(mydf3, aes(DaysBeforeArrival, book.speed)) +
    geom_bar(stat="identity")  +
    facet_grid(DayOfWeek ~ Hotel)

enter image description here