データの重複を取り除く方法を考えます。
今回は全変数の値に対して重複をみて、ユニークな値のみ残すようにします。
data Q1;
input X Y Z $;
cards;
1 2 A
3 5 C
7 4 B
1 2 A
3 5 C
7 5 B
1 2 A
1 2 A
9 6 D
9 6 D
3 5 C
;
run;
のデータから
を作ります。
【解法1】
proc sort data=Q1 out=A1 noduprec;
by X;
run;
byステートメントがないとsortプロシジャが動かせないので入れているだけで
指定はどの変数でもいいです。noduprecは全変数で同一の値を持つオブザベーションが
ある場合にまとめてくれます。
proc sort data=Q1 out=A1_ nodupkey;
by X Y Z;
run;
のようにnodupkeyを使って全変数をbyステートメントに指定しても当然OKです。
【解法2】
proc freq data=Q1 noprint;
tables X*Y*Z/out=A2(drop=COUNT PERCENT);
run;
freqプロシジャで組み合わせの頻度集計をしておいて、頻度と割合をdropすることで
必然的にユニークな値のみが残ります。
この方法のいいところは、今回は違いますが、たとえば、重複しているレコードの数が
2レコードの組み合わせのみ残せといったような、わけのわからない条件がついた場合に
頻度データを持っているので次のように対応できるというところです。
proc freq data=Q1 noprint;
tables X*Y*Z/out=A2_(where=(COUNT=2));
run;
【解法3】
proc sql noprint;
create table A3 as
select distinct X,Y,Z
from Q1
;
quit;
【解法4】
proc sql noprint;
create table A4 as
select X,Y,Z
from Q1
union
select X,Y,Z
from Q1
;
quit;
【解法5】
proc sql noprint;
create table A5(drop=DUMMY) as
select X,Y,Z,max(X) as DUMMY
from Q1
group by X,Y,Z
;
quit;
解法3-5はSQLです。書き方はほかにもいくらでもあるので、省略します。
普通に解法3で充分なのですが、個人的に面白いのは、冗長な処理ですが解法4です。
unionに allを指定しないと、結合後のデータから重複が取り除かれるという性質を利用して
自分に自分をくっつけて、同じものを消します。ぷよぷよみたいですね。
0 件のコメント:
コメントを投稿