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

求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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:55:21