绘制具有开始和结束日期的数据的直方图

时间:2015-05-23 21:04:20

标签: r datetime ggplot2

我有一个类似这样的数据集:

          start_date       end_date        outcome
1         2014-07-18       2014-08-20         TRUE
2         2014-08-04       2014-09-23         TRUE
3         2014-08-01       2014-09-03         TRUE
4         2014-08-01       2014-09-03         TRUE
5         2014-12-10       2014-12-10         TRUE
6         2014-10-11       2014-11-07         TRUE
7         2015-04-27       2015-05-20         TRUE
8         2014-11-22       2014-12-25         TRUE
9         2015-03-24       2015-04-26         TRUE
10        2015-03-12       2015-04-10        FALSE
11        2014-05-29       2014-06-28        FALSE
12        2015-03-19       2015-04-20         TRUE
13        2015-03-25       2015-04-26         TRUE
14        2015-03-25       2015-04-26         TRUE
15        2014-07-09       2014-08-10         TRUE
16        2015-03-26       2015-04-26         TRUE
17        2014-07-09       2014-08-10         TRUE
18        2015-03-30       2015-04-28         TRUE
19        2014-03-13       2014-04-13         TRUE
20        2015-04-01       2015-04-29         TRUE

我想绘制一个直方图,其中每个条形对应一个月,并且它包含该月份中FALSE / ALL =(FALSE + TRUE)的比例。

在R中最简单的方法是什么?最好使用ggplot?

1 个答案:

答案 0 :(得分:1)

这是一种方法。有更好的方法来做到这一点。但我会离开我的尝试。主要工作是为图形创建一个新的数据框。使用上面的数据,我首先将因子转换为日期对象。如果您的数据中有日期对象,则不需要此项。然后,我使用start_date汇总了end_datecount()的数据。我绑定了两个数据框,并进一步进行了计算,以获得每月FALSE的比例。

library(zoo)
library(dplyr)
library(ggplot2)
library(lubridate)

mutate_each(mydf, funs(as.POSIXct(., format = "%Y-%m-%d")), -outcome) %>%
mutate_each(funs(paste(year(.),"-",month(.), sep = "")), vars = -outcome) -> foo1;
count(foo1, start_date, outcome) %>% rename(date = start_date) -> foo2;
count(foo1, end_date, outcome) %>%
rename(date = end_date) %>%
bind_rows(foo2) %>%
group_by(date, outcome) %>%
summarize(total = sum(n)) %>%
summarize(prop = length(which(outcome == FALSE)) / sum(total)) %>%
mutate(date = as.Date(as.yearmon(date))) -> foo3

ggplot(data = foo3, aes(x = date, y = prop)) +
geom_bar(stat = "identity") +
scale_x_date(labels = date_format("%Y-%m"), breaks = date_breaks("month")) +
theme(axis.text.x = element_text(angle = 90, vjust = 1))

enter image description here