在R中筛选患者数据:如何为联用两种药物的患者返回布尔值/字符串
如何在R中高效标记服用特定药物组合的患者
刚好之前处理过类似的需求,不用拆分数据框再映射回原数据,不管是用dplyr还是基础R都能一步到位完成你的需求。
首先先重现你的模拟数据:
df <- data.frame(pt_id=c("p1","p2","p3","p4","p1","p2","p3","p4"), drug=c("d1","d1","d1","d1","d2","d2","d3","d3"))
方法1:用dplyr(推荐,代码可读性高)
借助分组操作,我们可以针对每个患者的药物列表直接判断是否同时包含d1和d2,然后把结果添加为新列:
library(dplyr) df_result <- df %>% group_by(pt_id) %>% # 判断当前患者是否同时服用d1和d2,返回TRUE/FALSE mutate(drug_combo = all(c("d1", "d2") %in% drug)) %>% # 如果需要返回指定字符串,比如"on_d1_d2",可以改成下面这行: # mutate(drug_combo = ifelse(all(c("d1", "d2") %in% drug), "on_d1_d2", "not_on_combo")) ungroup()
代码解释:
group_by(pt_id):按患者ID分组,让后续的判断针对每个患者的药物集合进行all(c("d1", "d2") %in% drug):检查当前患者的药物列表里是否同时包含d1和d2,all()确保两个药物都存在才返回TRUEmutate():把判断结果添加成新列drug_combo,每个患者的所有行都会得到相同的判断结果ungroup():取消分组,回到普通数据框格式
运行后得到的结果完全符合你的需求:
# A tibble: 8 × 3 pt_id drug drug_combo <chr> <chr> <lgl> 1 p1 d1 TRUE 2 p2 d1 TRUE 3 p3 d1 FALSE 4 p4 d1 FALSE 5 p1 d2 TRUE 6 p2 d2 TRUE 7 p3 d3 FALSE 8 p4 d3 FALSE
方法2:用基础R(无需额外包)
如果你不想加载dplyr,可以用基础R的ave()函数实现同样的效果:
df$drug_combo <- ave(df$drug, df$pt_id, FUN = function(x) all(c("d1", "d2") %in% x))
ave()会自动按pt_id分组,对每个组的药物列表应用判断函数,然后把结果填充到对应行,最终得到的结果和上面一致。
内容的提问来源于stack exchange,提问作者Tai
相关产品推荐
相关产品推荐

