使用 ggplot2 按日期或周绘制频率或比例图

问题描述 投票:0回答:2

我是一名流行病学家,我对 R 还很陌生。我有一个长格式的简单疫苗接种数据,如下所示:

data<-data.frame(id=c(1,1,1,1,2,2,2,3,3,3,3),date=c("01/12/2020","02/12/2020","03/12/2020","04/12/2020",
"01/31/2020","03/12/2020","04/05/2020","02/12/2020","04/12/2020","05/12/2020","01/12/2020"),vac_date=c("","02/02/2020","","04/02/2020","","","04/01/2020","","04/01/2020","05/01/2020",""),dose=c('',1,'',2,'','',1,'',1,2,''))

id:患者身份证明
日期:调查日期
vac_date: 疫苗接种日期
剂量:表示接种剂量

我真的很难在脑海中创建频率线图。我试过了

ggplot(data, aes(x = date, y = vac_date)) + geom_line()

疫苗接种的日期和次数令人困惑。我想计算 2 个图:

  1. 无论剂量如何,按日期或周绘制频率或比例图
  2. 按日期或周按剂量的频率或比例图(叠加) 如下图所示

https://imgur.com/KEoV4cR

有人可以提供一些帮助来获取上述绘图吗?谢谢。

r ggplot2 frequency
2个回答
0
投票

您在这里遇到了一些不同的问题。

  • 首先是您的数据格式错误。您不能在 R 的数字列中使用空字符串来指示丢失的数据。这只会将整个列变成一个字符向量,这意味着您无法对其执行任何数学运算。相反,数字或日期列中的缺失值应标记为
    NA
  • 其次,您的日期目前只是字符串,需要转换为实际日期。
  • 第三,假设
    date
    列是准确的,那么
    vacc_date
    列在这里似乎无关紧要。我们感兴趣的是在给定日期之前实际接种疫苗的所有参与者的比例。不需要调查日期本身。

为了解决所有这些问题,我首先定义要显示绘图的开始日期和结束日期。我们还应该计算数据集中的参与者数量。

participants <- length(unique(data$id))
start_date <- as.Date('2020-01-01')
end_date <- as.Date('2020-03-01')

现在让我们整理一下数据,删除无用的

date
列,以及其中没有疫苗信息的无用行。然后,我们可以将
dose
vac_date
转换为正确的格式,并计算数据集中每个日期接种疫苗的参与者比例:

library(tidyverse) 

plot_df <- data %>%
  select(-date) %>%
  filter(nzchar(vac_date)) %>%
  mutate(vac_date = lubridate::dmy(vac_date)) %>%
  mutate(dose = as.numeric(dose)) %>%
  group_by(dose) %>%
  arrange(dose, vac_date) %>%
  reframe(vac_date = c(start_date, vac_date, end_date),
          vacc = c(0, row_number(), n()) / participants)

现在我们的数据如下所示,一列表示疫苗接种日期,一列表示在该日期之前接种疫苗的参与者的百分比,一列表示他们接种了多少剂量的疫苗。

plot_df
#> # A tibble: 9 x 3
#>    dose vac_date    vacc
#>   <dbl> <date>     <dbl>
#> 1     1 2020-01-01 0    
#> 2     1 2020-01-04 0.333
#> 3     1 2020-01-04 0.667
#> 4     1 2020-02-02 1    
#> 5     1 2020-03-01 1    
#> 6     2 2020-01-01 0    
#> 7     2 2020-01-05 0.333
#> 8     2 2020-02-04 0.667
#> 9     2 2020-03-01 0.667

我们的绘图代码可能看起来像这样:

ggplot(plot_df, aes(vac_date, vacc)) +
  geom_step(aes(color = factor(dose))) +
  scale_y_continuous('Percent vaccinated', labels = scales::percent) +
  scale_x_date('Date', date_labels = '%d %b %Y', date_breaks = 'month') +
  scale_color_manual('Dose', values = c('navy', 'orangered')) +
  theme_minimal(base_size = 16) 

这使我们能够了解参与者在任何时刻进行第一次和第二次疫苗接种的百分比。

创建于 2023-10-19,使用 reprex v2.0.2


0
投票

要获得一周的价值,您可以这样做:

#This will turn you vac_date column into a date
data$vac_date <- lubridate::mdy(data$vac_date)
# This will create an integer column with the number of weeks from the first
# recorded vaccination to the date
data$vac_week <-as.integer(floor(difftime(data$vac_date,
                   min(data$vac_date,na.rm = TRUE), units = "weeks")))

然后你可以用

绘制你的密度
ggplot(data, aes(x = vac_week, colour = dose)) +
 geom_freqpoly()

查看不同的剂量和

ggplot(data, aes(x = vac_week)) + geom_freqpoly()

用于聚合图。

要获取日期而不是一周,您可以在绘图时将

vac_week
替换为
vac_date

© www.soinside.com 2019 - 2024. All rights reserved.