如何使用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
相关产品推荐
相关产品推荐

