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、難しいよーー!



2023年5月4日木曜日

PROC SQLでの変数ラベルの挙動


あまり知られていない&需要があるのか分からん機能。
まず例から。

data test;
 label x="AA#AA" y="#BB#BB";
 x=1;
 y=2;
run;

proc sql;
 select * from test;
quit;




PROC SQL限定で働く機能で、
ラベルの先頭をアンダーライン「_」以外の半角記号にすると、その文字をその変数ラベルの改行用文字にできるようです。

📝ポイント
  • ラベルだけで、データ部分には影響しない
  • PROC SQLで見たときに改行されてるように見えているだけで、実際のデータセットの変数ラベルに改行が入るわけではない。
  • 日本語等のマルチバイト文字は改行用文字に設定出来ないと思いますが、リファレンスに書かれていないため不明。