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

在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()确保两个药物都存在才返回TRUE
  • mutate():把判断结果添加成新列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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:12:34