詰めSAS5回目_データの重複を取り除く


データの重複を取り除く方法を考えます。
今回は全変数の値に対して重複をみて、ユニークな値のみ残すようにします。

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 件のコメント:

コメントを投稿