SAS学习(4)

您所在的位置:网站首页 sas中小于等于 SAS学习(4)

SAS学习(4)

2023-09-13 02:22| 来源: 网络整理| 查看: 265

最近遇到数据中出现重复数据,需要剔除出只出现一次的数据,在讨论过程中发现不止一种方法可以解决问题,在这里将想到的所有方法做一整理,如果有新方法欢迎大家补充。

简单编一个示例数据集:

data a1; input record_id b1 b2; datalines; 1 2 3 1 1 3 1 2 5 2 3 6 3 2 7 6 7 4 5 3 2 5 8 9 ; run;

(1)proc freq

具体代码如下:

proc freq data=a1 noprint; table record_id/out=a1_test1(keep=record_id count where=(count>1)); run;

运行代码后,得到的新数据集a1_test1就会只保留重复的record_id以及重复的次数

(2)proc sort

可以使用proc sort 中的NODUPKEY和NOUNIQUEKEY来完成重复数据的处理。

NODUPKEY 主要用于剔除by 语句后的变量名中重复的观测,

(NODUPKEY需要与NODUP在实际应用中辨析需要辨析:NODUP是剔除掉完全重复的相邻观测,NODUPKEY只提出by语句后的变量重复的观测)

NOUNIQUEKEY主要用于剔除by 语句后的变量名中唯一的观测

具体代码如下:

proc sort data=a1 nodupkey out=a1_test2; by record_id ; run;/*剔除重复的观测*/ proc sort data=a1 nouniquekey out=a1_test3; by record_id ; run;/*剔除唯一的观测*/

(3)First.variable&Last.variable

首先需要对数据集进行排序,具体代码如下:

proc sort data=a1;by record_id;run; data a1_test4; set a1; by record_id; if first.record_id=last.record_id=1 then output;/*剔除了重复的观测*/ run;

在这里需要注意的是,proc sort中使用NODUPKEY剔除重复观测时,导出的数据集还是会保留出现重复数据的第一条观测,但是使用First.var和Last.var的话是会把重复数据全部删除,需要根据实际据需求选择两种方法。(如下图)

还想到利用First.variable和Last.variable生成一个order变量,用于统计重复次数,再对order变量进行处理达到清除重复数据的目的,但是较为麻烦,在此不多作赘述。

 (4)proc sql

最简单粗暴的方法就是使用distinct,但是需要注意使用distinct只能剔除完全一致的行(不管是否相邻,但还是会保留出现重复的第一行,不会完全删除)

还有一种方法是利用FREQ summary function、GROUP BY clause以及HAVING clause,具体代码如下:

proc sql; select *,freq(record_id) as id_cnt from a1 group by record_id having id_cnt ge 2;/*输出重复数据*/ quit;

目前想到的方法只有这些,如果其他的思路也希望多交流~

 参考资料:

https://support.sas.com/resources/papers/proceedings/proceedings/sugi25/25/cc/25p106.pdf

SAS数据集中重复数据的处理方法



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3