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

如何使用SAS数组提取诊断日期前1个月的用药状态值

SAS提取诊断日期前1个月用药状态实现方案

核心实现逻辑

这个场景用SAS日期函数配合动态变量取值就能实现,不需要手动硬编码每个ID的判断逻辑,核心步骤如下:

  • 用intnx()函数计算诊断日期往前偏移1个月的日期,自动处理月末、跨年的边界问题,不会出现手动算月份出错的情况
  • 将偏移后的日期转换为YYYYMM格式的字符串,和用药变量的后缀命名规则对齐
  • 动态匹配对应后缀的用药变量,直接提取取值即可

可直接运行的代码(推荐写法,简洁不易错)

data want;
    set test;
    * 计算诊断日期前1个月的日期,same参数保证日期和原诊断日的日序一致,自动处理月末场景;
    pre_1m_date = intnx('month', Diagnosed_date, -1, 'same');
    * 生成目标用药变量的YYYYMM后缀;
    target_suffix = put(pre_1m_date, yymmn6.);
    * 动态拼接变量名,直接提取对应用药状态;
    pre_1m_medication = input(vvaluex(cats('medication', target_suffix)), best.);
    * 删除中间计算变量;
    drop pre_1m_date target_suffix;
run;

结果校验

针对给出的示例数据,运行后结果完全匹配需求:

  • ID=A:诊断日2020/02/28,前1个月为2020年1月,提取medication202001取值0
  • ID=B:诊断日2020/02/28,前1个月为2020年1月,提取medication202001取值1
  • ID=C:诊断日2020/04/30,前1个月为2020年3月,提取medication202003取值0

可选:纯数组遍历写法

如果你更熟悉数组循环逻辑,也可以用显式数组遍历匹配的方式实现,效果和上面的写法一致:

data want;
    set test;
    * 用通配符批量引用所有medication开头的用药变量,后续新增月份变量不用改代码;
    array med_list[*] medication:;
    pre_1m_date = intnx('month', Diagnosed_date, -1, 'same');
    target_ym = put(pre_1m_date, yymmn6.);
    pre_1m_medication = .;
    do i = 1 to dim(med_list);
        * 提取当前遍历到的用药变量名,截取后6位的年月标识;
        var_ym = substr(vname(med_list[i]), 11, 6);
        if var_ym = target_ym then do;
            pre_1m_medication = med_list[i];
            leave; * 匹配到目标值后直接退出循环,减少不必要计算;
        end;
    end;
    drop i pre_1m_date target_ym var_ym;
run;

注意:如果存在诊断日期前1个月无对应用药变量的情况(比如诊断日为2020年1月,前1个月为2019年12月,但数据集未录入对应月份变量),上述代码会自动返回缺失值,不会触发运行报错,你可以根据业务规则补充缺失值处理逻辑。

内容的提问来源于stack exchange,提问作者Des

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:01:00