如何在R语言宽格式患者用药数据中识别药物及剂量随时间的变化?
问题描述
我有一个包含多名患者不同检查时间用药情况的大型数据集:Medication1与Dose1代表基线时的药物及剂量,Medication2与Dose2代表第二次检查时的情况,以此类推。需要找出两类患者:
- 更换过药物的患者
- 同一药物剂量发生变化的患者及对应药物
示例代码
# 修正后的示例数据(药物名称需用字符串格式) ID= c(1,2,3) Medication1= c("Ciprofloxacin", "Amoxicillin", "Penicillin") Dose1= c(10, 10, 10) Medication2= c("Ciprofloxacin", "Benzylpenicillin", "Penicillin") Dose2= c(20, 10, 10) Medication3= c("Ciprofloxacin", "Benzylpenicillin", "Penicillin") Dose3= c(10, 15, 10) ID_MED <- data.frame(ID, Medication1, Dose1, Medication2, Dose2, Medication3, Dose3)
预期结果
- 药物更换的患者:仅2号
- 同一药物剂量变化的患者及药物:1号(Ciprofloxacin)、2号(Benzylpenicillin)
解决方法
将宽格式数据转换为长格式后,分组统计即可实现需求,这里使用tidyverse工具包处理:
library(tidyverse) # 把宽格式转为长格式,拆分时间维度 long_data <- ID_MED %>% pivot_longer( cols = -ID, names_to = c(".value", "time"), names_pattern = "(Medication|Dose)(\\d+)" ) %>% mutate(time = as.integer(time)) # 筛选更换药物的患者 drug_switch <- long_data %>% group_by(ID) %>% summarise(has_switch = n_distinct(Medication) > 1) %>% filter(has_switch) %>% pull(ID) # 筛选同一药物剂量变化的患者及对应药物 dose_change <- long_data %>% group_by(ID, Medication) %>% summarise(has_dose_change = n_distinct(Dose) > 1) %>% filter(has_dose_change) %>% ungroup() # 输出结果 cat("药物更换的患者:", paste(drug_switch, collapse = "、"), "\n") cat("同一药物剂量变化的患者及药物:\n") print(dose_change)
代码说明
- 转长格式:通过
pivot_longer将每个时间点的药物、剂量拆分为单独行,让数据结构更适合时间序列分析。 - 药物更换判断:按患者ID分组,统计该患者使用过的药物种类数,若大于1则说明更换过药物。
- 剂量变化判断:按患者ID+药物分组,统计该药物的剂量种类数,若大于1则说明该药物剂量有变化。
内容的提问来源于stack exchange,提问作者USER12345
相关产品推荐
相关产品推荐

