如何用R按受试者最早采血时间过滤重复样本数据集?
使用R语言筛选每位患者的最早采血记录
核心思路
基于患者唯一标识(示例中的「研究ID」)分组,提取每组中采血日期最早的记录。以下是两种常用实现方案:
方案一:dplyr+lubridate基础处理(推荐新手)
这是通用度最高的方法,适配绝大多数场景:
1. 安装并加载依赖包
# 首次运行需安装包 install.packages(c("readxl", "dplyr", "lubridate")) # 加载工具包 library(readxl) library(dplyr) library(lubridate)
2. 读取Excel数据
# 替换为你的Excel文件实际路径 df <- read_excel("你的数据集路径.xlsx")
3. 转换采血日期为日期格式
原始数据中的日期是字符型,必须转为日期格式才能正确比较先后:
df <- df %>% mutate(采血日期 = mdy(采血日期)) # 匹配m/d/y格式,若你的日期格式不同可改用dmy()/ymd()
4. 按研究ID分组,筛选最早记录
# 按研究ID分组,保留每组中采血日期最小的行 df_first_record <- df %>% group_by(研究ID) %>% filter(采血日期 == min(采血日期)) %>% ungroup() # 取消分组状态
如果同一患者同一天有多个记录,filter会保留所有同一天的记录;若只想保留其中一条,可改用:
df_first_record <- df %>% group_by(研究ID) %>% slice_min(采血日期, n = 1) %>% ungroup()
方案二:使用admiral包(临床数据专用)
admiral是专为临床研究数据设计的工具包,针对这类基线记录筛选有标准化函数:
1. 安装并加载admiral
install.packages("admiral") library(admiral)
2. 处理日期并筛选最早记录
# 先统一日期格式 df <- df %>% mutate(采血日期 = mdy(采血日期)) # 使用admiral专用函数提取最早记录 df_first_record <- df %>% derive_extreme_records( by_vars = vars(研究ID), # 分组变量 order = vars(采血日期), # 排序依据 mode = "first" # 取最早记录 )
注意事项
- 若Excel日期格式混乱,可自动识别多格式:
采血日期 = parse_date_time(采血日期, c("mdy", "dmy", "ymd")) - 确认「研究ID」是患者的唯一标识,若需加入其他分组维度,可调整
group_by或by_vars中的变量 - 十万级以内的数据集,上述方法效率足够,无需额外优化
内容的提问来源于stack exchange,提问作者dragon_cake
相关产品推荐
相关产品推荐

