楼主: moonstone
8770 6

[SAS] SAS中三种常用数据查重方法的深入比较 [推广有奖]

讲师

74%

还不是VIP/贵宾

-

威望
0
论坛币
10444 个
通用积分
336.8455
学术水平
160 点
热心指数
169 点
信用等级
124 点
经验
263516 点
帖子
237
精华
1
在线时间
520 小时
注册时间
2007-4-27
最后登录
2024-4-11

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
虽然利用查找重复记录的方法之前也讨论过,但是一直以来未进行深入研究和比较,今天对三种常用查重方法进行了一下细化分析,非常实用,供大家参考。

样板数据集如下:
  1. data ex;
  2. input a b c;
  3. cards;
  4. 2 2 3
  5. 2 2 3
  6. 4 5 6
  7. 4 5 6
  8. 4 5 6
  9. 4 5 6
  10. 4 4 4
  11. 4 4 5
  12. 7 7 8
  13. 9 5 5
  14. ;
  15. run;
复制代码


具体查重方法如下:
1,sort语句





  1. proc sort NODUPRECS out=ex1 dupout=ex2;
  2. by a b ;
  3. run;
复制代码


ex1保留的是未重复的记录,ex2保留的是重复的记录。

如果将NODUPRECS换成NODUPKEY,会得到不一样的结果。简单地说:NODUPRECS 比较的是数据集中的所有变量,而NODUPKEY只比较by中列举的变量(也即通常所说的key变量)。 所以如果sort选项为NODUPRECS,上面的程序中将by中列举的变量换成a, 或a b, 或a b c,结果都是一样的。但是如果sort选项为NODUPKEY,结果就完全不一样。



2,data步



前提:需要先对数据进行排序。


  1. proc sort data=ex;
  2. by a b c ;
  3. run;

  4. data ex1 ex2;
  5.      set ex;
  6.      by a b c;
  7.      if first.c then output ex1;
  8.      else output ex2;
  9. run;
复制代码


该过程完全等价于sort语句的选项NODUPKEY,所以first.后面的变量为a, 或b, 或c,结果完全不一样。

如果不想让ex2数据集里面的重复记录多次出现,而是重复记录只出现一次,并统计该重复记录出现的次数。该思路非常经典。可用于查看数据库中按某几个变量定义的重复记录到底有多少条。该思路运用sort是解决不了的,采用data步如下:


  1. data ex1 ex2;
  2.      set ex;
  3.      by a b c;
  4.      retain n 0;
  5.      if first.c then
  6.                  do;
  7.                     n=1;
  8.                     output ex1;
  9.                  end;              
  10.                 else n+1;
  11.      if last.c and n>=2 then
  12.                     output ex2;
  13. run;
复制代码

retain的作用:在data步循环执行开始前初始化新变量值,使得在下一次循环前仍使用该初始化值。详细用法参考:http://support.sas.com/publishing/pubcat/chaps/58176.pdf

上述ex2数据集也可以采用freq和summary语句实现,具体如下。


  1. proc freq data = ex noprint ;
  2.     table a*b*c/ out =ex2 (keep = a b c Count where = (Count > 1)) ;
  3. run ;

  4. proc summary data=b nway;
  5.      class a b c;
  6.      output out=c (drop=_type_  where=(_freq_>1));
  7. run;
复制代码


      上述两程序基本原理是一样的。以summary语句为例,nway所起的作用很大,如果不加nway 的话,那么summary的结果将把所有类型都输出来。所有类型的意思就是,class的3个变量的取值分别存在两种大的分类:缺失和不缺失,而每个变量未缺失的时候又各自有不同的取值。所以,所有类型的意思就是:3个变量,包括取缺失值和不同非缺失值的所有组合。这样的结果肯定不是我们想要的,因为我们想要的是3个变量都不缺失的结果,所以就要加上nway。



3、Sql语句







  1. proc sql noprint;
  2.      create table ex1 as
  3.             select distinct a, b, c
  4.      from ex;
  5. quit;
复制代码



select distinct:选取以关键变量(如上例中的a b c)确定的不同记录,该过程同样等价于sort语句的选项NODUPKEY,所以select distinct后面的变量不同,结果也不同。

同时SQL能更进一步进行频次统计,等价于data步输出的两个数据集功能的合并。


  1. proc sql noprint;
  2.      create table ex2 as
  3.             select a, b, c,
  4.             count(*) as freq
  5.       from ex
  6.       group by a, b, c;
  7. quit;
复制代码


总结以上三类方法,SQL语句最为方便实用,推荐实用


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:数据查重 Publishing NODUPKEY Distinct proc sql 数据 数据查重 SAS SQL语句 数据

已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
xddlovejiao1314 + 100 + 100 + 5 + 5 + 5 精彩帖子
niuniuyiwan + 100 + 100 + 5 + 5 + 5 精彩帖子

总评分: 经验 + 200  论坛币 + 200  学术水平 + 10  热心指数 + 10  信用等级 + 10   查看全部评分

本帖被以下文库推荐

沙发
sunyongfifth 发表于 2015-3-7 20:27:30 |只看作者 |坛友微信交流群
感谢分享。
已有 1 人评分经验 论坛币 收起 理由
xddlovejiao1314 + 10 + 3 鼓励积极发帖讨论

总评分: 经验 + 10  论坛币 + 3   查看全部评分

使用道具

藤椅
niuniuyiwan 在职认证  发表于 2015-11-10 11:12:58 |只看作者 |坛友微信交流群
感谢分享
已有 1 人评分经验 论坛币 收起 理由
xddlovejiao1314 + 10 + 3 鼓励积极发帖讨论

总评分: 经验 + 10  论坛币 + 3   查看全部评分

使用道具

板凳
xddlovejiao1314 学生认证  发表于 2015-11-10 11:49:52 |只看作者 |坛友微信交流群
谢谢分享。

使用道具

报纸
Setehk 发表于 2016-2-5 16:33:26 |只看作者 |坛友微信交流群
proc sort data=ex;
by a b c ;
run;

data ex1 ex2;
     set ex;
     by a b c;
     if first.c then output ex1;
     else output ex2;
run;

请问first.c是代表什么呢,不太明白呢。。

使用道具

地板
稍等等 学生认证  发表于 2016-10-7 15:43:54 |只看作者 |坛友微信交流群
谢谢楼主,总结的很有帮助

使用道具

7
mercycccc 发表于 2018-7-20 17:33:13 |只看作者 |坛友微信交流群
谢谢楼主

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-9 04:41