You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于含多观测的tibble绘制患者年龄直方图?

如何按ID去重保留唯一出生日期以绘制年龄直方图?

问题背景

我有一个每行对应一条观测的tibble,包含ID编号、DOB(出生日期)和检测结果列,示例数据如下:

IDDOBresult
a1940-01-0115
a1940-01-0117
b1933-05-2011
b1933-05-2020

我想要绘制患者年龄的直方图,但当前生成的直方图会统计每个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:50:27