如何在SAS中按分组保留随机行(去除公司ID重复项)
SAS数据集按ID随机保留唯一行的解决方案
你之前的代码存在两个关键问题:一是每个ID组只生成了一个随机数,导致同一ID下所有观测的随机值相同,排序后顺序没变化;二是proc sort的语法存在错误。以下是两种可行的修正方案:
方案一:生成独立随机数后排序去重
/* 为每个观测生成独立随机数 */ data temp; set have; /* 用系统时间作为种子,保证每次运行随机性不同;若需固定结果,替换为固定数字如12345 */ random = ranuni(time()); run; /* 按ID分组,组内按随机数排序 */ proc sort data=temp out=temp_sorted; by id random; run; /* 按ID去重,保留每组随机排序后的第一行 */ proc sort data=temp_sorted out=want nodupkey; by id; run;
方案二:PROC SQL直接随机抽取(更简洁)
无需中间数据集,一步完成随机选取:
proc sql outobs=max; create table want as select * from have group by id having ranuni(time()) = max(ranuni(time())); quit;
关键说明:
- 两种方案的核心都是给每个观测生成独立随机值,通过随机排序或随机取值的方式,确保每个ID保留的行是随机选中的,而非固定首行。
- 如果需要可复现的随机结果,把
ranuni(time())替换为固定种子(比如ranuni(9876)),这样每次运行都会得到相同的随机选取结果。
内容的提问来源于stack exchange,提问作者LuizZ
相关产品推荐
相关产品推荐

