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

需求:使用SAS代码按规则推导derived变量的技术实现

问题描述

现有如下数据集,需通过SAS代码推导derived变量:

SubjectREGNOderivedDate of MetsFDDAT
001-00312/15/20182-Sep-14
001-00312/15/201814-Oct-14
001-00312/15/20182-Sep-14
001-00322/15/20188-Jun-15
001-003312/15/20187-Mar-18
001-003312/15/20187-Mar-18
001-003422/15/20183-May-18
001-003532/15/201825-Jun-18
001-003532/15/201825-Jun-18

变量推导规则

  • 若FDDAT早于Date of Mets,则derived变量为空;
  • 若FDDAT晚于Date of Mets,针对同一Subject:
    • 当前行REGNO与上一行相同时,derived重复上一行数值;
    • 当前行REGNO发生变化时,derived在上一行数值基础上加1;
    • 同一REGNO的所有行需保持相同的derived数值。
SAS实现代码
/* 转换字符型日期为SAS日期格式,确保日期比较准确 */
data temp;
    set original_data;
    date_of_mets_sas = input(Date_of_Mets, mmddyy10.);
    fddat_sas = input(FDDAT, date9.);
    format date_of_mets_sas mmddyy10. fddat_sas date9.;
run;

/* 按Subject和REGNO排序,保证分组顺序正确 */
proc sort data=temp;
    by Subject REGNO;
run;

/* 推导derived变量 */
data final_data;
    set temp;
    by Subject REGNO;
    retain current_derived;
    
    /* 新Subject组初始化derived计数器 */
    if first.Subject then current_derived = 0;
    
    if fddat_sas > date_of_mets_sas then do;
        /* 新REGNO组时累加计数器 */
        if first.REGNO then current_derived + 1;
        derived = current_derived;
    end;
    else do;
        derived = .; /* 日期不满足时设为空值 */
    end;
    
    /* 删除临时日期变量,保留原始字段 */
    drop date_of_mets_sas fddat_sas;
run;

代码说明

  • 先将字符格式的日期转换为SAS内置日期格式,避免字符串比较的误差;
  • 通过排序确保同一Subject下的REGNO连续分组;
  • 用retain语句持续跟踪当前的derived值,在新的REGNO组且日期条件满足时自动累加;
  • 同一REGNO组内的所有行共享该组的derived值,符合规则要求;
  • 当FDDAT早于Date of Mets时,将derived设为SAS缺失值(对应空值)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 10:20:37