需求:使用SAS代码按规则推导derived变量的技术实现
问题描述
现有如下数据集,需通过SAS代码推导derived变量:
| Subject | REGNO | derived | Date of Mets | FDDAT |
|---|---|---|---|---|
| 001-003 | 1 | 2/15/2018 | 2-Sep-14 | |
| 001-003 | 1 | 2/15/2018 | 14-Oct-14 | |
| 001-003 | 1 | 2/15/2018 | 2-Sep-14 | |
| 001-003 | 2 | 2/15/2018 | 8-Jun-15 | |
| 001-003 | 3 | 1 | 2/15/2018 | 7-Mar-18 |
| 001-003 | 3 | 1 | 2/15/2018 | 7-Mar-18 |
| 001-003 | 4 | 2 | 2/15/2018 | 3-May-18 |
| 001-003 | 5 | 3 | 2/15/2018 | 25-Jun-18 |
| 001-003 | 5 | 3 | 2/15/2018 | 25-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
相关产品推荐
相关产品推荐

