有时候我们需要对数据进行去重,用到的最多的就是nodupkey,不知道有没有初学者,我就先详细讲一下nodupkey.
测试数据:
data test;
input id name $ age subject $;
cards;
01 Jack 29 chinese
01 Jack 29 English
01 Jack 29 math
01 Jack 29 math
02 Tom 23 music
02 Tom 23 chinese
02 Tom 23 chinese
02 Tom 23 chemical
03 Mary 21 English
03 Mary 21 physical
03 Mary 21 sports
;
nodupkey是根据你的排序变量去重的,排序后根据排序变量取第一个观测,然后剩下的重复的就删除了。多加一个或者少加一个结果都可能不一样。
比如我们根据id ,name去重,那么对SAS来说,Jack重复了3次,Tom重复了3次,Mary重复了两次,因为只是根据id,name排序,所以后面的变量SAS是不看的,即使后面的变量有些值不一样。
proc sort nodupkey data=test out=test2;
by id name ;
run;
自己参照上面的测试数据看看是不是取第一个。然后我们加上subject这个变量,那么这时候就得输出不同subject的观测了,然后把重复的删除。
proc sort nodupkey =test3 data=test out=test2;
by id name age subject;
run;
Jack删除了一个重复的“math”,Tom删除了一个重复的"chinese".这些都是在前面已经比较了id name age是否一致的情况下,最后再判断的“subject”,所以输出是受排序变量顺序的影响的。
如果我把测试数据的第四条观测,Jack前面的id改成2,那么这条观测最终会被输出,例子我就不举了,你们自己去试试。
如果我还想输出是哪些重复的被删除了,可以用上duoput选项。
proc sort nodupkey dupout=test3 data=test out=test2;
by id name ;
run;
proc sort nodupkey dupout=test3 data=test out=test2;
by id name age subject;
run;
结果我就不说明了,你们自己对照着看吧,这些应该算是基础知识了。但是我今天重点要讲的是下面这些:
我们发现dupout选项只输出了重复的观测,而且看这些重复的观测就知道不重复观测数据集输出的是哪些值(也就是data=test2输出的观测),但是如果我想把重复的不重复的都输出在一个数据里呢?
虽然我们可以把dupout数据集和不重复的数据集set在一起也能实现目的(相对来说麻烦一点,得删除一些不重复的数据),但是现在有一个选项就能实现这个功能,就是nouniquekey。
proc sort nouniquekeydata=test out=test4;
by id name age subject;
run;
可以看到重复的都输出在一个数据集里,但是不重复的就没输出。所以有时候merge报多对多,可以用上dupout选项或者这个选项看下是那些观测重复了。
也就是说如果某个受试者拥有独一无二的值,那么用这个选项不会被输出;如果某个受试者有重复的值(当然是要看你以哪些变量判定他是否重复),那么重复的都会被输出。
网友评论