R语言如何筛选匹配多个drug_name的分组及计算med_start间隔
实现方案(基于dplyr)
需求1:筛选同时包含多种指定药物/药物种类达标的id
- 你的思路是可行的,完全可以先按
id分组再做条件过滤,同时支持2种及以上药物的筛选场景,代码示例如下:
library(dplyr) # 场景1:指定需要同时包含的药物列表 target_drugs <- c("pembrolizumab", "nivolumab") res1 <- data %>% group_by(id) %>% filter(all(target_drugs %in% drug_name)) %>% # 确保组内包含所有目标药物 ungroup() # 场景2:不指定具体药物,只要不同药物数量≥N即可(例:N=2) res1_ext <- data %>% group_by(id) %>% filter(n_distinct(drug_name) >= 2) %>% ungroup()
运行上述代码,样例数据中符合条件的id=2的所有记录都会被保留。
需求2:筛选存在用药日期间隔大于x天的id
- 核心逻辑是分组后计算同id下的最大日期间隔,只要最大间隔大于x,就必然存在至少两条记录满足间隔要求,示例代码如下(x取30天为例):
x <- 30 res2 <- data %>% group_by(id) %>% filter(max(med_start) - min(med_start) > x) %>% ungroup()
- 如果你的需求是相邻两次用药的间隔大于x天,可以用排序加偏移函数的写法:
x <- 30 res2_adjacent <- data %>% group_by(id) %>% arrange(med_start) %>% # 按用药日期升序排列 filter(any(med_start - lag(med_start) > x, na.rm = T)) %>% ungroup()
样例数据中id=2的最早用药日期为2018-01-05,最晚为2018-11-01,间隔远大于30天,会被筛选出来;id=1的两次用药间隔为21天,不符合要求会被过滤。
内容的提问来源于stack exchange,提问作者sutsabs
相关产品推荐
相关产品推荐

