ラベル freq の投稿を表示しています。 すべての投稿を表示
ラベル freq の投稿を表示しています。 すべての投稿を表示

freqプロシジャのnlevelsオプション

データに含まれる変数ごとの水準数(度数じゃなくて、カテゴリ数・パターン数)を取得したい場合
freqプロシジャの、nlevelsが便利です。


例えば以下の様な適当なデータセットがあったとして

data Q1;
X=1;Y='A';output;
X=1;Y='B';output;
X=.;Y='A';output;
X=2;Y='D';output;
X=3;Y='C';output;
X=2;Y='E';output;
run;



ods output Nlevels=A1;
proc freq data=Q1 nlevels;
   tables _all_;
run;

とすると、アウトプットの方は






















こんな感じです。赤く括った箇所が、nlevelsオプションとつけたことで現れた部分です。
水準数と、その中で欠損水準・非欠損水準の数を出してくれます。

で、ods outputで、これをデータセット化すると





となります。

こっから、マクロ変数に突っ込みたい時なんかに便利ですが、
一つ要注意なのが、欠損水準が指定した全変数中一つもない場合、変数「NMissLevels」「NNonMisslevels」の変数そのものが出現しないという問題です。

要するに

ods output Nlevels=A2;
proc freq data=Q1 nlevels;
   where X^=.;
   tables _all_;
run;

とすると

データセットは






の2変数だけです。

プログラマーの気持ちとしては、こういう、データ依存で出力デザインが可変になるのは、ちょっと困りますよね。
欠損水準数とか、値0でいいから、列持たせといてよ!こっちはコードで変数指定してるのに、無かったら、こけちゃうやん!って感じです。

まあ、そこだけ注意してコードを書いてください。





FREQのtablesステートメントは複数指定できるという話

人が書いたコードを点検していた際の話ですが

data Q1;
X='い';Y=1;Z='A';output;
X='い';Y=2;Z='B';output;
X='ろ';Y=1;Z='A';output;
X='い';Y=1;Z='B';output;
X='は';Y=3;Z='A';output;
X='は';Y=3;Z='C';output;
run;

みたいに適当なデータセットがあり、それに対して

proc freq data=Q1 noprint;
 tables X/out=A1;
run;
proc freq data=Q1 noprint;
 tables X*Y/out=A2;
run;
proc freq data=Q1 noprint;
 tables Z/out=A3;
run;

とfreqを3連撃していたので、それって

proc freq data=Q1 noprint;
 tables X/out=A1;
 tables X*Y/out=A2;
 tables Z/out=A3;
run;

で1手で済んで、多分、実行速度的にもこっちの方が早いんじゃないかと言ったところ
「こんな書き方ができるとは!」って感じで、とても驚かれました。

そういうことってありますよね。僕も日々、そんなことできたんだって感動ばかりです


FREQ,MEANSなどで集計する時に、各グループと全体で集計できるようにデータセットを加工しておく話

基本的なテクニックなのですが、僕がSASをはじめたばかりの頃に教えてもらって、おぉ!となったことを思い出したので書きます。

以下のようなデータセットがあったとします。

data Q1;
length GROUP $10.;
GROUP='A群';VAL='い';output;
GROUP='A群';VAL='ろ';output;
GROUP='A群';VAL='は';output;
GROUP='A群';VAL='い';output;
GROUP='B群';VAL='ろ';output;
GROUP='B群';VAL='ろ';output;
GROUP='B群';VAL='い';output;
GROUP='B群';VAL='ろ';output;
run;












これを各群ごと、かつ全体で集計するやりかたが、全然わからなかったのですが












data _Q1;
 set Q1
     Q1(in=ina);
  if ina then GROUP='全体';
run;

proc freq data=_Q1 noprint;
 table GROUP*VAL/out=A1(drop=PERCENT);
run;

でいいわけです。

流し込むデータを2倍にしてから集計するという発想がなかったので凄く驚いた覚えがあります。
今思うと、この時に、SASのデータステップは面白いなとスイッチが入った気がします。