求SAS药物利用计算逻辑的等效R实现(含处方重叠处理)
R实现药物处方覆盖统计(等效SAS核心逻辑)
原始数据
df <- data.frame(member_id = c(603, 603, 603), fill_dt = c("02/17/2005", "06/13/2005", "08/11/2005"), drug = c("a", "a", "a"), days_supply = c(30,30,30))
核心逻辑实现步骤
1. 基础数据预处理:日期格式转换与研究周期确定
先将字符型日期转为R标准日期格式,同时确定每个用户的180天研究周期(首次购药日为start_dt,加179天得到end_dt):
library(dplyr) library(lubridate) df_clean <- df %>% mutate(fill_dt = mdy(fill_dt)) %>% group_by(member_id, drug) %>% mutate( start_dt = min(fill_dt), end_dt = start_dt + days(179) ) %>% ungroup()
2. 处理处方重叠问题
按购药日期排序后,将重叠处方的起始日延后至前一处方结束日+1,同时确保修正后的处方结束日不超出研究周期:
df_overlap_fixed <- df_clean %>% group_by(member_id, drug) %>% arrange(fill_dt) %>% mutate( # 计算前一处方的结束日期 prev_end = lag(fill_dt + days(days_supply - 1)), # 修正当前处方起始日:若早于前一处方结束日则延后 fill_dt_fixed = if_else( !is.na(prev_end) & fill_dt <= prev_end, prev_end + days(1), fill_dt ), # 计算修正后的处方结束日 fill_end_fixed = fill_dt_fixed + days(days_supply - 1) ) %>% # 截断超出研究周期的处方结束日 mutate(fill_end_fixed = pmin(fill_end_fixed, end_dt)) %>% ungroup()
3. 生成研究周期每日覆盖标记
为180天周期内的每一天生成覆盖标记(1=有药物覆盖,0=无覆盖),同时保留每日日期用于后续周统计:
# 生成每个用户的研究周期日期序列 date_seq <- df_overlap_fixed %>% distinct(member_id, drug, start_dt, end_dt) %>% rowwise() %>% mutate(study_days = list(seq(start_dt, end_dt, by = "day"))) %>% unnest(study_days) %>% ungroup() # 匹配处方覆盖区间,生成每日标记 daily_coverage <- date_seq %>% left_join( df_overlap_fixed %>% select(member_id, drug, fill_dt_fixed, fill_end_fixed), by = c("member_id", "drug") ) %>% mutate(covered = if_else(study_days >= fill_dt_fixed & study_days <= fill_end_fixed, 1, 0)) %>% # 去重避免同一日期被重复标记 distinct(member_id, drug, study_days, .keep_all = TRUE) %>% # 未匹配到处方的日期标记为0 mutate(covered = replace_na(covered, 0)) %>% # 转宽表生成每日标记列(便于后续统计) pivot_wider( id_cols = c(member_id, drug, start_dt, end_dt), names_from = study_days, values_from = covered, names_prefix = "day_" )
4. 计算总覆盖天数与覆盖比例
基于每日标记统计核心指标:
final_result <- daily_coverage %>% rowwise() %>% mutate( dayscovered = sum(c_across(starts_with("day_")), na.rm = TRUE), p_dayscovered = dayscovered / 180 ) %>% ungroup()
结果说明
final_result保留了所有每日覆盖标记列(格式为day_YYYY-MM-DD),可直接按study_days的周分组,统计每周药物暴露天数。- 处方重叠问题已通过修正起始日解决,确保覆盖天数统计无重复计算。
内容的提问来源于stack exchange,提问作者Uknowepi
相关产品推荐
相关产品推荐

