如何在SAS中去除重复姓名且保留原始出现顺序?
在SAS中保留原始顺序提取唯一值
问题背景
现有如下SAS数据集:
Data ss; infile datalines; input ename $; datalines; Ram Sita Ram Arjun Sita Ram Arjun ; run;
需要提取ename的唯一值,且输出顺序与原始数据中首次出现的顺序一致(即Ram→Sita→Arjun)。
常规的proc sort+first.ename方法虽然能实现去重,但会对数据排序,输出顺序变为Arjun→Ram→Sita,不符合需求:
proc sort data=ss; by ename; run; data want; set ss; by ename; if first.ename; run;
解决方案:使用哈希表实现无排序去重
利用SAS哈希表可以快速记录已出现的变量值,遍历原始数据集时仅保留首次出现的记录,完美保留原始顺序:
data want; set ss; /* 初始化哈希表,用于存储已见过的ename值 */ if _n_ = 1 then do; declare hash seen(); seen.definekey('ename'); seen.definedone(); end; /* 仅保留首次出现的ename记录 */ if seen.check() ne 0 then do; output; seen.add(); end; run;
代码说明
- 当
_n_=1(处理第一条记录时),创建哈希表seen,以ename作为索引键。 seen.check()方法检查当前ename是否已存在于哈希表:返回0表示已存在,非0表示未出现过。- 仅当
ename未出现过时,执行output保留该记录,并通过seen.add()将其存入哈希表,避免后续重复记录被输出。
运行后输出结果严格遵循原始数据中首次出现的顺序:
Ram Sita Arjun
内容的提问来源于stack exchange,提问作者jkatam
相关产品推荐
相关产品推荐

