编写SAS代码标记同一会员同一日期同一索赔含LT/RT修饰符的记录
实现索赔修饰符的批量标记(SAS代码)
需求说明
当同一会员(Mem_id)的同一索赔(clm_id)在同一服务日期(DOS)下的所有记录中,同时存在LT和RT修饰符时,将该组所有记录的Flag字段标记为'LR_RT',其他情况标记为'Okay'。
示例数据准备
先还原示例中的输入数据集:
data claim_data; length Mem_id $5 clm_id $5 DOS date9. Mod1-Mod4 $2 Flag $6; informat DOS mmddyy10.; format DOS date9.; input Mem_id clm_id DOS Mod1 Mod2 Mod3 Mod4; datalines; AA000 12345 1/1/2023 LT 59 . . AA000 12345 1/1/2023 60 RT . . BA000 11111 2/2/2023 T1 T6 RT . BA000 11111 2/2/2023 60 LT . . CA000 22222 3/3/2023 T1 T6 RT . CA000 22222 3/3/2023 60 50 . 80 DA000 33333 4/4/2023 T1 AS SX . DA000 33333 4/4/2023 59 55 . LT EA000 44444 5/5/2023 T8 AB SX . EA000 44444 5/5/2023 59 69 . UU ; run;
处理代码(BY组方法)
使用DATA步结合BY组处理,先按分组字段排序,再判断每组是否同时包含LT和RT:
/* 先按分组字段排序,确保同组记录连续 */ proc sort data=claim_data; by Mem_id clm_id DOS; run; /* 标记Flag字段 */ data claim_flagged; set claim_data; by Mem_id clm_id DOS; /* 保留每组内的修饰符存在状态 */ retain has_LT has_RT; /* 组起始时初始化状态标记 */ if first.DOS then do; has_LT = 0; has_RT = 0; end; /* 检查当前记录的所有修饰符,更新状态 */ if 'LT' in (Mod1, Mod2, Mod3, Mod4) then has_LT = 1; if 'RT' in (Mod1, Mod2, Mod3, Mod4) then has_RT = 1; /* 组结束时,统一为该组所有记录赋值Flag */ if last.DOS then do; Flag = ifc(has_LT and has_RT, 'LR_RT', 'Okay'); end; output; run;
代码解释
- 排序处理:按
Mem_id、clm_id、DOS排序,保证同一会员、同一索赔、同一服务日期的记录连续排列,方便BY组处理。 - 状态初始化:在每组第一条记录(
first.DOS为真)时,初始化has_LT和has_RT为0,用于记录该组是否存在对应修饰符。 - 修饰符检查:遍历每组内的所有记录,检查
Mod1-Mod4字段中是否包含LT或RT,更新对应的状态标记。 - 批量赋值:在每组最后一条记录(
last.DOS为真)时,根据has_LT和has_RT的状态,用ifc函数统一为该组所有记录的Flag字段赋值。
验证结果
运行代码后,输出的claim_flagged数据集将与示例要求的Flag结果完全匹配:
- AA000/12345/1/1/2023组:同时存在LT和RT → Flag='LR_RT'
- BA000/11111/2/2/2023组:同时存在LT和RT → Flag='LR_RT'
- CA000/22222/3/3/2023组:仅存在RT无LT → Flag='Okay'
- DA000/33333/4/4/2023组:仅存在LT无RT → Flag='Okay'
- EA000/44444/5/5/2023组:无LT和RT → Flag='Okay'
内容的提问来源于stack exchange,提问作者Amit Kumar
相关产品推荐
相关产品推荐

