我是一名流行病学家,我对 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 个图:
有人可以提供一些帮助来获取上述绘图吗?谢谢。
您在这里遇到了一些不同的问题。
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
要获得一周的价值,您可以这样做:
#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
。