基于ID分组更新morbidity字段:SAS数据集条件修改技术问询
实现SAS数据集的条件修改需求
方法一:先标记ID再合并修改
先统计每个ID是否存在morbidity=1的记录,生成标记数据集,再和原数据集关联后修改字段值:
/* 生成每个ID的标记:是否有morbidity=1的记录 */ data id_flag; set DB; by ID; if first.ID then flag = 0; if morbidity = 1 then flag = 1; if last.ID then output; keep ID flag; run; /* 合并原数据集和标记数据集,按规则修改morbidity */ data DB1; merge DB id_flag; by ID; if flag = 1 and morbidity = 2 then morbidity = 0; run;
方法二:单数据步用BY组+RETAIN直接处理
利用SAS的BY组处理和RETAIN语句,在一次数据步中完成标记和修改,无需额外生成中间数据集:
/* 若原数据集未按ID排序,先执行排序 */ proc sort data=DB; by ID; run; data DB1; set DB; by ID; retain has_1 0; /* 保留上一条记录的标记值,初始为0 */ if first.ID then has_1 = 0; /* 每个ID的第一条记录重置标记 */ if morbidity = 1 then has_1 = 1; /* 只要当前ID存在morbidity=1,标记为1 */ /* 按规则修改字段 */ if has_1 = 1 and morbidity = 2 then morbidity = 0; drop has_1; /* 不需要保留标记变量 */ run;
说明
- 两种方法均可实现需求,方法二无需额外数据集,处理效率更高,适合大数据量场景
- 使用
by ID语句前,需确保数据集已按ID排序,若未排序需先执行proc sort步骤
内容的提问来源于stack exchange,提问作者NewUsr_stat
相关产品推荐
相关产品推荐

