notsortedオプションを侮るなかれ。データセットの格納順を活かしたby処理

今、以下のようなデータセットを受け取って、Xの値ごとに、適当な値でグループ化する変数を作ってと言われたとします。架空の話ですが。

data Q1;
X='A';output;
X='A';output;
X='B';;output;
X='B';output;
X='B';output;
X='C';output;
X='C';output;
X='A';output;
X='A';output;
run;













はいはいと、言って僕は

proc sort data=Q1 out=_Q1;
 by X;
run;

data A1;
 set _Q1;
 retain GROUP 0;
 by X;
 if first.X then GROUP+1;
run;

こう書いて













としました。

XがAの値には1、Bには2、Cには3をつけました。


すると、違う!そうじゃない!
こういう風にしてくれ!と言って見せられたのが













です。

ソートやユニーク、キーとかそういうデータ構造の基本的概念がない人と話すと
よく、データの格納順を重視していると感じます。

僕が、Xの値が同一のAなので、まとめられるので、当然こうなるのですがといったところで

何を言ってるんだ??最初に出てくるAと次にでてくるAの間に別の文字が入って区切れとる
だろうが!同じじゃない!

となるわけです。


さてさて、
ではどうしましょうか?retainでXの値を保持して、前のオブザベーションとの
比較分岐をいれますか?面倒です。

そういった時に役に立つのがnotsortedオプションです。


data A2;
 set Q1;
 retain GROUP 0;
 by X notsorted;
 if first.X then GROUP+1;
run;

とすると













となって、求めるべき結果になるわけです。

データステップのbyは、その変数での事前ソートを要求するため
notsortedをつけずに実行すると当然












エラーになります。

notsortedをつけることで、元データの格納順のまま、by処理が可能なわけです。

これは例えばmeansプロシジャ等、種種のプロシジャでもどうようのことができます。
連続して格納されている値ごとに処理したい場合はnotsortedが使えるわけです。

まあ、あまり筋がいいとは言えませんが。








0 件のコメント:

コメントを投稿