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

如何在R语言Data Frame中按首次给药时间排除指定Creatinine值

解决R语言中患者肌酐值筛选与均值计算问题

问题背景

现有如下结构的DataFrame:

PatientIDDateDoseCreatinine
10102.08.23NA65
10103.08.231000NA
10104.08.231000NA
10104.08.23NA68
10210.09.23NA89
10210.09.231000NA

每个患者对应多行记录,每行仅记录一种类型的变量数据。需求为:

  • 针对每个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:43:28