如何用Proc Sort Nodupkey实现仅Index=0时去重的SAS数据处理?
解决方案:分情况处理重复行
要实现「Index=1时保留所有重复行,Index=0时仅保留重复行中的一行」,不能直接用PROC SORT NODUPKEY(它会对所有行生效),可以用以下两种方法:
方法一:拆分数据集后合并
先拆分出Index=1的所有行(全部保留),再对Index=0的行去重,最后合并结果:
/* 提取Index=1的所有行,直接保留 */ data db_index1; set db; where index = 1; run; /* 对Index=0的行按所有列去重,仅保留唯一行 */ proc sort data=db(where=(index=0)) nodupkey out=db_index0; by id admission discharge index; run; /* 合并两个数据集得到最终结果 */ data db1; set db_index1 db_index0; run;
方法二:BY组Data步一次处理(更高效)
先按关键列排序,再用BY组逻辑判断是否输出行,只需读取一次源数据:
/* 先按ID、入院日期、出院日期、Index排序,确保重复行相邻 */ proc sort data=db; by id admission discharge index; run; /* 用BY组逻辑筛选行:Index=1时全输出,Index=0时仅输出每组第一行 */ data db1; set db; by id admission discharge index; /* 满足任一条件则输出:要么是Index=1的行,要么是Index=0组的第一行 */ if index = 1 or first.index; run;
逻辑说明
- 排序后,相同ID、入院/出院日期、Index的行会被归为一组
first.index是BY组自动生成的变量:每组第一行时为1,后续行则为0- 对Index=0的组,只输出
first.index=1的行,实现去重;Index=1的组则全部输出,保留所有重复行
内容的提问来源于stack exchange,提问作者NewUsr_stat
相关产品推荐
相关产品推荐

