如何在R语言Data Frame中按首次给药时间排除指定Creatinine值
解决R语言中患者肌酐值筛选与均值计算问题
问题背景
现有如下结构的DataFrame:
| PatientID | Date | Dose | Creatinine |
|---|---|---|---|
| 101 | 02.08.23 | NA | 65 |
| 101 | 03.08.23 | 1000 | NA |
| 101 | 04.08.23 | 1000 | NA |
| 101 | 04.08.23 | NA | 68 |
| 102 | 10.09.23 | NA | 89 |
| 102 | 10.09.23 | 1000 | NA |
每个患者对应多行记录,每行仅记录一种类型的变量数据。需求为:
- 针对每个
PatientID,移除首次给药日期之前的肌酐值(每个患者最多存在1个此类值) - 计算各患者剩余肌酐值的均值
例如:患者101需移除第一条肌酐值,患者102的肌酐值与首次给药日期同一天,需保留。
解决方案(使用dplyr包)
步骤1:加载依赖包并构建示例数据
如果未安装dplyr,先执行安装命令:
install.packages("dplyr") library(dplyr)
构建示例DataFrame:
df <- data.frame( PatientID = c(101, 101, 101, 101, 102, 102), Date = c("02.08.23", "03.08.23", "04.08.23", "04.08.23", "10.09.23", "10.09.23"), Dose = c(NA, 1000, 1000, NA, NA, 1000), Creatinine = c(65, NA, NA, 68, 89, NA) )
步骤2:数据处理与筛选计算
result <- df %>% # 将字符型日期转为可比较的Date类型(格式匹配原数据的日.月.年) mutate(Date = as.Date(Date, format = "%d.%m.%y")) %>% # 按患者分组处理 group_by(PatientID) %>% # 提取每个患者的首次给药日期:取Dose非NA记录中的最小日期 mutate(first_dose_date = min(Date[!is.na(Dose)], na.rm = TRUE)) %>% # 筛选有效肌酐记录:肌酐值非空,且日期不早于首次给药日期 filter(!is.na(Creatinine) & Date >= first_dose_date) %>% # 计算每个患者的剩余肌酐均值 summarise(mean_creatinine = mean(Creatinine, na.rm = TRUE)) %>% # 取消分组状态 ungroup() # 查看最终结果 print(result)
输出结果
# A tibble: 2 × 2 PatientID mean_creatinine <dbl> <dbl> 1 101 68 2 102 89
代码关键逻辑说明
mutate(Date = as.Date(...)):将字符格式的日期转换为R可识别的Date类型,确保日期能进行大小比较first_dose_date = min(Date[!is.na(Dose)], na.rm = TRUE):精准定位每个患者第一次给药的日期filter(!is.na(Creatinine) & Date >= first_dose_date):过滤掉首次给药前的无效肌酐记录,保留符合要求的数据summarise(mean_creatinine = mean(...)):基于筛选后的数据计算每个患者的肌酐均值
内容的提问来源于stack exchange,提问作者Anna-Kristina
相关产品推荐
相关产品推荐

