2023年5月7日日曜日

「PROC REPORT」の「COMPUTE」がうまく動かないんだけど②



以下記事の続き。



失敗例1

data test;
input x y;
cards;
. 10
. 20
1 30
1 40
2 50
2 60
;
proc report data=test missing spanrows;
  column x y z;
  define x / order order=internal;
  define y / display;
  define z / computed;
  compute z / character length=1;
    if x=. then z="Y";
  endcomp;
run;
😕


  • まず、XをORDER変数にしています。またORDER変数が欠損値のオブザベーションも出力対象とするため、MISSINGオプションを指定。
  • 次にCOMPUTEで「if x=. then z="Y"」として、Xが欠損値のオブザベーションに"Y"のフラグを立てたんですが、、想定では1、2オブザベーション目だけに"Y"が入るはずなのに、4、6オブザベーション目にも"Y"が入っている?!


XをORDER変数にしたことが影響してると思うんですが、リファレンスにこの辺の挙動の説明見つけられませんでした。

ORDER変数(GROUP、ANALYSIS、ACROSS変数とかも?)を参照した処理(IFステートメントや関数など)は想定通りの結果にならないことがあるので、使用は避けたほうが良さそうです。




失敗例2

proc report data=test missing spanrows;
  column x y;
  define x / order order=internal;
  define y / display;
  compute x;
    if x=. then x=2;
  endcomp;
run;
😕


「if x=. then x=2」として、「Xが欠損値」の場合は「X=2」のオブザベーションとして以下のように一塊で出力したかったのに、、


あと、失敗例①を知っちゃうと、なんとなく以下のようになるのでは?と思っちゃいません?(失敗例①で「X=.」と判定されたオブザベーションが、今回「X=2」になると思ってしまった)



ORDER変数(GROUP、ANALYSIS、ACROSS変数とかも?)に対して、COMPUTEで値をいじると、うまく絡み合ってくれなくて、想定外の結果になる場合があるのでご注意ください。

そもそも元の変数値をPROC REPORT上でいじるのって、あまりやらない、というか良くないのかも?




あと未検証ながら


以下リファレンス内の「Restriction」の記載によると、、

よく分からないですが、LAG, DIF, RANUNI, DATETIMEなどの「non-deterministic関数」については、特定条件のときに使わない方が良いらしいです。


COMPUTE、難しいよーー!



0 件のコメント:

コメントを投稿