多条件筛选单药治疗数据集的实现方法
筛选一线单药治疗的患者记录(R实现)
问题背景
现有包含patient_id、diagnosis_date、diagnosis、trt_date和drug_code字段的数据集,需要筛选出**首次治疗为单药(仅A或仅B)**的患者所有记录,排除首次治疗为联合用药的患者。
原始数据集代码
# Create the dataset data <- data.frame( patient_id = c(1, 1, 1, 1, 5, 5, 7, 7), diagnosis_date = as.Date(c("1/9/10", "1/9/10", "1/9/10", "1/9/10", "1/11/10", "1/11/10", "1/9/10", "1/9/10"), format = "%m/%d/%y"), diagnosis = c("breast cancer", "breast cancer", "breast cancer", "breast cancer", "breast cancer", "breast cancer", "breast cancer", "breast cancer"), trt_date = as.Date(c("1/20/10", "1/20/10", "1/21/10", "1/21/10", "1/29/10", "1/30/10", "1/25/10", "1/26/10"), format = "%m/%d/%y"), drug_code = c("A", "B", "A", "A", "B", "A", "A", "A") )
解决方案(Tidyverse版本)
使用dplyr包的分组、过滤和连接操作,逻辑清晰易读:
library(dplyr) # 核心筛选逻辑 filtered_data <- data %>% # 按患者分组 group_by(patient_id) %>% # 计算每个患者的首次治疗日期 mutate(first_trt = min(trt_date)) %>% # 筛选首次治疗日的记录,统计药物种类数 filter(trt_date == first_trt) %>% distinct(drug_code) %>% mutate(drug_count = n()) %>% # 保留首次治疗为单药的患者 filter(drug_count == 1) %>% select(patient_id) %>% # 匹配回该患者的所有原始记录 right_join(data, by = "patient_id") %>% ungroup() %>% # 对齐期望输出的列顺序 select(patient_id, diagnosis_date, diagnosis, trt_date, drug_code) # 输出结果 print(filtered_data)
解决方案(Base R版本)
无需额外安装包,适合轻量场景:
# 1. 计算每个患者的首次治疗日期 first_trt_dates <- tapply(data$trt_date, data$patient_id, min) # 2. 判断每个患者是否为首次单药治疗 is_valid <- sapply(unique(data$patient_id), function(id) { # 获取该患者首次治疗日的所有药物 drugs <- data$drug_code[data$patient_id == id & data$trt_date == first_trt_dates[as.character(id)]] # 去重后药物数量为1则符合条件 length(unique(drugs)) == 1 }) # 3. 筛选符合条件的患者所有记录 filtered_data_base <- data[data$patient_id %in% names(is_valid[is_valid]), ] # 输出结果 print(filtered_data_base)
结果说明
两种方法均会得到符合要求的输出:
patient_id diagnosis_date diagnosis trt_date drug_code 5 2010-01-11 breast cancer 2010-01-29 B 5 2010-01-11 breast cancer 2010-01-30 A 7 2010-01-09 breast cancer 2010-01-25 A 7 2010-01-09 breast cancer 2010-01-26 A
内容的提问来源于stack exchange,提问作者Bruh
相关产品推荐
相关产品推荐

