SAS中如何在basket值变更时生成独立ID?现有方法存在问题
SAS 实现连续basket分组生成独立ID
你需要的是游程分组ID——连续相同的basket值为同一组,即使后续再次出现相同basket,也要生成新的独立ID,而非按basket值全局唯一分组。之前用first.basket结合计数的方法失效,是因为该方法依赖按basket排序后分组,无法识别非连续的同值basket。
以下是两种直接解决的方法:
方法1:使用lag()函数+retain
这是最简洁的实现方式,直接基于原始数据顺序判断:
data want; set have; /* have为你的原始数据集名称 */ retain group_id 0; /* 首次观测或当前basket与上一行不同时,分组ID自增 */ if _n_ = 1 or basket ne lag(basket) then group_id + 1; run;
方法2:使用retain存储上一行值判断
如果不想用lag()函数,可通过保留上一行basket值来实现逻辑:
data want; set have; retain prev_basket group_id 0; if _n_ = 1 then do; group_id = 1; prev_basket = basket; end; else do; if basket ne prev_basket then do; group_id + 1; prev_basket = basket; end; end; drop prev_basket; /* 移除临时变量 */ run;
效果验证
假设原始数据为:
| basket |
|---|
| A |
| A |
| B |
| B |
| A |
| C |
运行代码后得到的group_id为:1,1,2,2,3,4,完全符合“每次basket值变化即生成新ID”的需求。
注意:无需对原始数据排序,否则会破坏原有顺序,导致同值
basket被合并为同一分组。
内容的提问来源于stack exchange,提问作者Megha
相关产品推荐
相关产品推荐

