monotonic関数の性質。_N_とはちょっと違うという話

monotonic関数は色々注意点もありますが、中々面白い関数です。

例えば以下のデータセットがあります

data Q1;
X=1;output;
X=1;output;
X=2;output;
X=3;output;
X=2;output;
X=2;output;
X=4;output;
X=3;output;
X=3;output;
run;

















それで、偶数のオブザベーション番号だけproc printしろっていわれたら、

proc print data=Q1;
 where mod(_N_,2)=0;
run;

なんて書きたくなりますが、もちろん_N_はwhereでは使えません。

ところが

proc print data=Q1;
 where mod(monotonic(),2)=0;
run;

ならいけます









これは何回も紹介している話なんですが、上記のことから
monotonic関数はwhereでも使える_N_みたいなものと認識してしまいがちなのですが
それはちょっと違います

例えば

data A1;
set Q1;
Y=monotonic();
run;



















となり

Y=_N_;とした場合と全く同じですが

以下のコードはどうなるでしょう?

data A2;
set Q1;
if x=1 then Y=monotonic();
if x=2 then Y=monotonic();
if x=3 then Y=monotonic();
if x=4 then Y=monotonic();
run;

実は

















と、Xの値ごとに連番が振られるんですね。

つまりmonotonic関数は、行番号を返しているのではなく、
monotonic関数を通って処理される回数をカウントして返しているようなイメージということなんですね。(理解が間違っていたらご指摘ください)

これは非常に面白い性質ですね。







0 件のコメント:

コメントを投稿