如何修改SAS数据集flag2变量?满足首条记录且ID无flag1=1时设为1
基于ID分组调整flag2赋值逻辑
原始数据集DB
data DB; input Id :$20. flag1 flag2; cards; 0001 0 1 0001 0 0 0001 1 0 0001 0 0 0001 0 0 0001 0 0 0002 0 1 0003 1 1 ;
原规则为仅当记录是对应ID的首条记录(first.ID = 1)时,将flag2赋值为1。现在需要调整逻辑,让flag2=1的条件变为:
该记录是对应ID的首条记录,且该ID的所有记录中从未出现
flag1 = 1的情况
目标数据集DB1
data DB1; input Id :$20. flag1 flag2; cards; 0001 0 0 0001 0 0 0001 1 0 0001 0 0 0001 0 0 0001 0 0 0002 0 1 0003 1 0 ;
实现方法
推荐分两步处理,逻辑清晰易维护:
- 先按ID分组,统计每个ID是否存在
flag1=1的记录; - 关联原始数据集,根据首条记录+无flag1=1的条件重新赋值flag2。
具体SAS代码
/* 第一步:统计每个ID是否存在flag1=1的记录 */ data id_flag; set DB; by Id; retain has_flag1 0; if flag1 = 1 then has_flag1 = 1; if last.Id then output; keep Id has_flag1; run; /* 第二步:关联原始数据,重新赋值flag2 */ data DB1; merge DB id_flag; by Id; /* 默认将flag2设为0 */ flag2 = 0; /* 仅满足首条记录+该ID无flag1=1时,将flag2设为1 */ if first.Id and has_flag1 = 0 then flag2 = 1; run;
逻辑说明
- 第一步通过
by Id分组,用retain变量has_flag1跟踪当前ID是否出现过flag1=1,在每个ID的最后一条记录输出该标记; - 第二步合并原始数据和统计结果,先把flag2默认设为0,只有满足
first.Id且has_flag1=0时,才将flag2设为1,完全匹配需求。
如果想仅用单次数据步实现,也可以用指针回溯的方式,但逻辑相对复杂:
data DB1; set DB; by Id; retain has_flag1 0; /* 首次处理该ID时初始化标记 */ if first.Id then do; has_flag1 = 0; first_rec = _n_; end; /* 发现flag1=1则标记该ID */ if flag1 = 1 then has_flag1 = 1; /* 该ID所有记录处理完毕,回溯修改首条记录的flag2 */ if last.Id then do; point = first_rec; do while(point <= _n_); set DB point=point; if point = first_rec then flag2 = (has_flag1 = 0); else flag2 = 0; output; point + 1; end; end; /* 跳过原始数据的默认输出 */ delete; run;
内容的提问来源于stack exchange,提问作者NewUsr_stat
相关产品推荐
相关产品推荐

