全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
7347 1
2012-04-07
经常会遇到合并多个数据库的情况,在数据大的时候还会遇到同一库里面会有重复ID,如何找到重复的ID号?查重后,如何以多个数据库中的一个为主库来合并其他的库?困扰了自己一段时间,现在就自己发现的问题以及解决该问题的简单技巧跟大家分享一下。

遇到这种情况,如果采用SPSS合并数据库的话,会出现一些意想不到的问题。首先,遇到重复ID,利用SPSS早期版本很难发现这一问题,直接提示不能合并,至少自己见过的SPSS 16是发现不了。目前自己所用的SPSS 19(不清楚17和18是否)可以发现此问题,并给出如下提示:
MATCH FILES /FILE=*
  /FILE='C:\Users\Administrator\Desktop\**.sav'
  /BY ID.
EXECUTE.
File #2
     KEY:   1E+013

>Warning # 5132
>Duplicate key in a file.  The BY variables do not uniquely identify each case
>on the indicated file.  Please check the results carefully.

上面这个例子中,虽然SPSS提示ID有重复,可又提出了另外一个问题,可以发现,在ID号足够长的时候,如上述例子中的13位,SPSS直接采用科学计数法来提示重复的ID号,也不清楚是自己不会设置的原因还是SPSS在该程序内部自动设置科学计数的原因,反正最终我还是没能发现很好的办法让SPSS将重复的ID显示完全。这等于SPSS在对待重复ID上没有实质性的改进,而且每次只能提醒一个ID号,在有多个重复的ID号的时候,还不能一次查出来。所以建议遇到这种情况时采用SAS来查重,并最终合并多个数据库。

采用SAS解决开始提出的问题,需要解决以下几个步骤
1、查找重复的记录数
2、核查后剔除重复的记录数
3、以一个库为主库,合并其他库

针对上述三个问题,分别以三个简单的例子来说明相关方法,
(1)、查找重复的记录数(转载自http://blog.sina.com.cn/s/blog_4b3c1a880100d230.html
data b;
input id $ a b c;
cards;
001 1  2  20
002 2  3  18
003 3  4  35
004 4  5  40
002 2  3  27
006 5  6  40
004 4  5  60
;
run;
proc summary data=b nway;
class id a b;
output out=c (drop=_type_  where=(_freq_>1));
run;
proc print data=c;
run;
结果如下:
                                Obs    id     a    b    _FREQ_
                                 1     002    2    3       2
                                 2     004    4    5       2

(2)核查后剔除重复的记录数(转载自http://blog.sina.com.cn/s/blog_4b3c1a880100d230.html
仍采用上述例子
proc sort data=b nodupkey out=d;
by id a b;
run;
proc print data=d;
run;
结果:
                                  Obs    id     a    b     c
                                   1     001    1    2    20
                                   2     002    2    3    18
                                   3     003    3    4    35
                                   4     004    4    5    40
                                   5     006    5    6    40

(3)、以一个库为主库,合并其他库
该问题主要是由于主库的观测数与其他要合并的数据库的观测数不一致,简单合并会导致最终合并的数据库里面出现很多缺失。也即改步主要目的是根据主库确定缺失记录,并删除缺失记录。
proc sort data=a ;
by id;
run;
……
*数据合并前记得排序;
data combined;
merge a b c;
by id;
if ax1=. then delete;
run;
其中ax1是只有a库中才有的而且没有缺失的变量。当然也有很多其它方法删除缺失,只要能到底目的都行。

希望这篇文章能对大家解决类似问题有所帮助。


二维码

扫码加我 拉你入群

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

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

全部回复
2012-4-12 13:31:27
学习了,谢谢楼主!
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群