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