楼主: moonstone
12326 10

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

已卖:1872份资源

讲师

74%

还不是VIP/贵宾

-

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

楼主
moonstone 发表于 2013-4-14 00:05:20 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

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

样板数据集如下:
data ex;
input a b c;
cards;
2 2 3
2 2 3
4 5 6
4 5 6
4 5 6
4 5 6
4 4 4
4 4 5
7 7 8
9 5 5
;
run;

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

proc sort NODUPRECS out=ex1 dupout=ex2;
by a b ;
run;

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

如果将NODUPRECS换成NODUPKEY,会得到不一样的结果。两者差别详细参考http://www2.sas.com/proceedings/sugi30/037-30.pdf。简单地说:NODUPRECS 比较的是数据集中的所有变量,而NODUPKEY只比较by中列举的变量(也即通常所说的key变量)。 所以如果sort选项为NODUPRECS,上面的程序中将by中列举的变量换成a, 或a b, 或a b c,结果都是一样的。但是如果sort选项为NODUPKEY,结果就完全不一样。

2,data步
前提:需要先对数据进行排序。

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;

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

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

data ex1 ex2;
     set ex;
     by a b c;
     retain n 0;
     if first.c then
                 do;
                    n=1;
                    output ex1;
                 end;              
                else n+1;
     if last.c and n>=2 then
                    output ex2;
run;

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

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

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

proc summary data=b nway;
     class a b c;
     output out=c (drop=_type_  where=(_freq_>1));
run;

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

3、Sql语句

proc sql noprint;
     create table ex1 as
            select distinct a, b, c
     from ex;
quit;

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

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

proc sql noprint;
     create table ex2 as
            select a, b, c,
            count(*) as freq
      from ex
      group by a, b, c;
quit;

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

二维码

扫码加我 拉你入群

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

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

关键词:数据查重 Proceedings Publishing NODUPKEY Distinct 数据

已有 6 人评分学术水平 热心指数 信用等级 收起 理由
霍文龙4 + 1 + 1 + 1 精彩帖子
1962xyy@163.com + 1 + 1 + 1 分析的有道理
boe + 1 + 1 + 1 分析的有道理
rdwalk + 1 + 1 + 1 总结得蛮好的 学习了 谢谢
suzhzh + 1 + 1 对论坛有贡献
yongyitian + 1 + 1 + 1 分析的有道理

总评分: 学术水平 + 6  热心指数 + 6  信用等级 + 5   查看全部评分

本帖被以下文库推荐

沙发
suzhzh 发表于 2013-4-14 07:58:21
Good summary
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
rdwalk + 1 + 1 + 1 总结得挺好的 学习了 谢谢

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
jinsen78 发表于 2013-5-15 00:43:26 来自手机
很经典

板凳
lfray 发表于 2013-7-3 14:16:28
请问楼主,您所介绍的第二点,if first.c then output ex1,我理解的是重复的c都不输入,可是为什么ex1数据集里会有重复的5?然后我把first.b也试了一下,也是一样有一个5是重复的,为什么会这样?我是新手,实践不多,求解答
   

报纸
jolterheadmmtt 发表于 2013-7-4 15:58:22
mark
LZ太好了

地板
lfray 发表于 2013-7-5 14:05:13
楼主还在不?求解答……

7
tj0412ymy 发表于 2013-7-5 14:18:40
  1. proc sql;
  2. create table ex2(keep=a b c) as
  3. select a, b, c, count(*) as freq
  4. from ex
  5. group by a, b, c
  6. ;
  7. quit;
复制代码

对LZ的SQL方法做个补充,在数据量较大时,比直接distinct效率更高一些:
若有兴趣,可用如下的程序测试一下:
  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;
  16. data test(drop=i);
  17. set ex;
  18. do i=1 to 100000;
  19. output;
  20. end;
  21. run;
  22. /*1. Group by*/
  23. proc sql;
  24. create table ex2(keep=a b c) as
  25. select a, b, c, count(*) as freq
  26. from test
  27. group by a, b, c
  28. ;
  29. quit;
  30. /*2. Distinct*/
  31. proc sql;
  32. create table ex2 as
  33. select distinct a, b, c
  34. from test
  35. ;
  36. quit;
复制代码

对SAS和统计方面感兴趣的朋友,请加SAS学习和认证讨论群:169157207。欢迎在群上讨论!

8
lxqleaves 发表于 2013-7-19 06:39:42
感谢分享

9
slimdell 发表于 2013-7-19 08:53:51
学习了,很好很强大
知乎专栏/微信公号同名:煮酒烹茶读书

10
dandan_9075 在职认证  发表于 2013-7-20 10:32:08
很好

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-5 06:08