ラベル [▼ 重複データの削除・抽出 の投稿を表示しています。 すべての投稿を表示
ラベル [▼ 重複データの削除・抽出 の投稿を表示しています。 すべての投稿を表示

2014年3月6日木曜日

SORTプロシジャの「NODUP」と「NODUPKEY」の違い。


昔、「NODUP」を「NODUPKEY」の省略形だと勘違いして使ったら、思ったとおりの動きをしてくれなくて困ったことがありました。 

今回は「NODUP」と「NODUPKEY」を混同しないようにするための注意喚起になります。
「NODUP」は、最新のリファレンスから記載が削除されていたので詳しい挙動は不明。利用は非推奨。



例

* Sample data ;
data DT1;
input A B$;
cards;
1 a
1 b
1 a
;

A B 
  1  
  a  
  1  
b  
  1
a  

* 「NODUP」を使ってみる ;
proc sort data=DT1 out=DT2 nodup;
  by A;
run;

期待した結果
A B 
  1  
  a  

↓

実際の結果
A B 
  1  
  a  
  1  
b  
  1
a  


解説

①「NODUP」は「NODUPRECS」を省略した書き方です。

これは、
BY変数で並べ替えた後、1つ前のレコードが全変数同じ値だったら、現レコードを削除する。
という動きをします。

②ここで注意するのは、
全変数同じ値のレコード(サンプルデータでは1行目と3行目)が存在していても、
BY変数で並べ替えた後、前後にレコードが隣り合っていないと削除していない点です。




似たオプション「NODUPKEY」の詳細は以下のリンクを参照下さい。
SORTプロシジャで重複レコードを削除・抽出する。


SORTプロシジャで重複レコードを削除・抽出する。



SORTプロシジャで重複レコードを削除・抽出するオプション「NODUPKEY」と「NOUNIQUEKEY」を紹介したいと思います。




サンプルデータ

data DT1;
input A B C$ @@;
cards;
1 1 a 1 2 a 2 1 c 2 1 b
;
 A 
 B  
 C  
  1     1     a  
  1    2  a 
  2    1  c   
  2    1  b   



例①

proc sort data=DT1 nodupkey out=DT2 dupout=DT3;
  by A B;
run;

DT2
 A 
 B  
 C  
  1     1     a  
  1    2  a 
  2    1  c 


DT3
 A 
 B  
 C  
  2     1  b   


解説

  • 「NODUPKEY」を指定すると、BY変数が重複してるレコードがあった場合に、最初のレコードのみ残して、以降の重複レコードを削除してくれる。
  • 「OUT=」のデータセットには削除後のレコードが入る。
  • 「DUPOUT=」のデータセットには削除したレコードが入る。
  • 「OUT=」を省略すると、「DATA=」のデータセットに上書きしてしまうので、注意!




例② (SAS9.3からの機能)

proc sort data=DT1 nouniquekey out=DT4 uniqueout=DT5;
  by A B;
run;

DT4
 A 
  B  
 C  
  2    1   c  
  2  1  b 


DT5
 A 
  B  
 C  
  1    1   a  
  1  2  a


解説

  • 「NOUNIQUEKEY」を指定すると、BY変数が重複してるレコードと、重複していないレコードを分割することが出来る。
  • 「OUT=」のデータセットには重複してるレコードが入る。
  • 「UNIQUEOUT=」のデータセットには重複してないレコードが入る。
  • 「OUT=」を省略すると、「DATA=」のデータセットに上書きしてしまうので、注意!



「NOUNIQUEKEY」 は結構助かる機能ですね。