如何在保持id和seq排序的SAS数据集中生成分组ID(grpid)?
解决SAS生成连续相同值分组ID的排序错误问题
问题分析
你需要在按id和seq排序的数据集里,为每个id下连续相同的value生成递增的grpid,但之前使用by id value时触发了BY variables are not properly sorted错误——因为数据集并非按id value排序,且你不能更改现有排序规则。
解决方案
利用retain保留分组状态,结合lag()函数对比前后行的value,仅按id进行分组(数据集已按id排序,不会触发排序错误),具体代码如下:
data want; set have; by id; /* 仅按id分组,匹配现有排序规则 */ retain grpid; if first.id then do; grpid = 1; end; else do; /* 对比当前行与上一行的value,不同则分组ID递增 */ if value ne lag(value) then grpid + 1; end; run;
代码说明
by id:仅按id分组,数据集已按id排序,SAS不会检查value的排序,避免报错。retain grpid:让grpid的值在数据步循环中保留到下一行,不会每次重置。first.id:处理每个id的第一行时,将grpid重置为1,确保每个id的分组从1开始。lag(value):获取上一行的value值,与当前行对比,当value变化时,grpid自动加1,实现连续相同value归为同一组的需求。
运行上述代码后,输出结果完全符合你要求的格式。
内容的提问来源于stack exchange,提问作者babsdoc
相关产品推荐
相关产品推荐

