如何筛选布洛芬服用后至死亡前使用的其他药物(R语言)
问题
需要统计养老院中服用多种药物的患者,在服用布洛芬(ibuprofen)之后到死亡前这段时间内使用过的其他药物,并筛选出符合条件的药物记录。
输入数据
原始R数据构造代码:
id <- c('1', '1', '1','1','2','2','2') drug <- c('ibuprofen','aleve','tylenol','claritin', 'ibuprofen','aleve','tums') start <- c('100','105','50','115','20','-9','30') death <- c('120','120','120','120','50','50','50') df <- data.frame(id, drug, start, death, stringsAsFactors = FALSE)
期望输出
最终需要得到的结果数据:
id <- c('1','1','2') drug <- c('aleve','claritin','tums') start <- c('105','115','30') result_df <- data.frame(id, drug, start, stringsAsFactors = FALSE)
现有代码
目前仅完成了筛选服用布洛芬的患者:
y <- df %>% filter(drug == "ibuprofen")
完整解决方案
要实现时间范围筛选,需要先处理时间类型,再关联对比,完整代码如下:
# 1. 转换时间列为数值型(原始数据是字符串,无法做大小比较) df$start <- as.numeric(df$start) df$death <- as.numeric(df$death) # 2. 提取每个患者服用布洛芬的时间和死亡时间 ibuprofen_info <- df %>% filter(drug == "ibuprofen") %>% select(id, ibuprofen_start = start, death) # 3. 筛选符合时间条件的其他药物 final_result <- df %>% filter(drug != "ibuprofen") %>% # 排除布洛芬本身 inner_join(ibuprofen_info, by = "id") %>% # 关联患者的布洛芬服用信息 filter(start > ibuprofen_start, start < death) %>% # 时间范围:布洛芬之后,死亡之前 select(id, drug, start) # 保留需要的列 # 输出结果 final_result
代码逻辑说明
- 必须先把
start和death转成数值型,否则字符串的大小比较会出错(比如"50"和"100"字符串对比会得到错误结果) - 先提取每个患者的布洛芬服用时间,方便后续和其他药物的时间做对比
- 过滤掉布洛芬本身,只关注其他药物,再通过患者ID关联对应的布洛芬时间和死亡时间
- 最后筛选出满足时间范围的记录,就是我们需要的结果
内容的提问来源于stack exchange,提问作者Nashe
相关产品推荐
相关产品推荐

