如何基于含多观测的tibble绘制患者年龄直方图?
如何按ID去重保留唯一出生日期以绘制年龄直方图?
问题背景
我有一个每行对应一条观测的tibble,包含ID编号、DOB(出生日期)和检测结果列,示例数据如下:
| ID | DOB | result |
|---|---|---|
| a | 1940-01-01 | 15 |
| a | 1940-01-01 | 17 |
| b | 1933-05-20 | 11 |
| b | 1933-05-20 | 20 |
我想要绘制患者年龄的直方图,但当前生成的直方图会统计每个DOB的所有出现次数,数据量为患者数×单患者观测数,而非仅患者数。我尝试的代码如下:
ggplot(d1, aes(eeptools::age_calc(dob = as.Date(DOB), enddate = Sys.Date(), units = 'years'))) + geom_histogram(binwidth = 1)
请问如何筛选数据,使每个ID仅保留一个DOB?
解决方案
你可以通过去重或分组取唯一值的方式处理数据,确保每个ID只对应一条出生日期记录,再绘制直方图。以下是几种实用方法:
方法1:用dplyr::distinct()直接去重
distinct()可按指定列去重,因为同一ID的DOB一致,保留任意一条即可:
library(dplyr) library(ggplot2) # 生成去重数据集,仅保留每个ID的唯一DOB d1_unique <- d1 %>% distinct(ID, DOB, .keep_all = FALSE) # 绘制直方图 ggplot(d1_unique, aes(eeptools::age_calc(dob = as.Date(DOB), enddate = Sys.Date(), units = 'years'))) + geom_histogram(binwidth = 1)
方法2:分组后取单条记录
如果需要更灵活的记录选择逻辑(比如取每个ID的第一条/最后一条观测),可以用分组切片:
d1_unique <- d1 %>% group_by(ID) %>% slice(1) # 取每个ID的第一条记录,DOB一致不影响结果 ggplot(d1_unique, aes(eeptools::age_calc(dob = as.Date(DOB), enddate = Sys.Date(), units = 'years'))) + geom_histogram(binwidth = 1)
方法3:直接在ggplot中嵌套数据处理
无需额外生成数据集,直接在绘图逻辑中完成去重:
ggplot(d1 %>% distinct(ID, DOB), aes(eeptools::age_calc(dob = as.Date(DOB), enddate = Sys.Date(), units = 'years'))) + geom_histogram(binwidth = 1)
内容的提问来源于stack exchange,提问作者nAUTILUS
相关产品推荐
相关产品推荐

