ひとつ前の記事に書きましたが、SAS社様の公式TwitterやFacebookでこのブログを紹介していただきましたので、ちょっとお行儀よく、久しぶりに基本的かつ真面目な話題をします。
各変数ごとに欠測の値が何オブザベーションあるかを1ステップでカウントしたいとします。
要は
data Q1;
X=1;Y='';Z=.;output;
X=2;Y='A';Z=.;output;
X=3;Y='B';Z=.;output;
run;
上記みたいなデータセットから
を作りたいということです。
さて、ぱっと思い浮かびました?意外と難しかったりしませんか?
proc meansが思いついた方もいたと思いますが
proc means data=Q1 noprint;
var X Z;
output out=A0(drop=_TYPE_ _FREQ_) nmiss=XMISS ZMISS;
run;
のように数値変数X Zに対してはnmiss=で欠損値カウントが可能ですが、文字値のYはvarに指定した時点でエラーになってしまいます。
freqが思いついた方もいるかもしれませんが、1ステップで、上記の形のデータセットを作るのは難しいはずです、多分。
基本、データを縦に考える時はSQL使えっていうのは僕の中の原則なので、
proc sql noprint;
create table A1 as
select sum(missing(X)) as XMISS
,sum(missing(Y)) as YMISS
,sum(missing(Z)) as ZMISS
from Q1;
quit;
は、正解です。上記の回答データセットの結果になります。
missingは欠損値の場合1、非欠損値の場合0なので、それをsumで合計すればよいわけです。
わざわざcase文書かなくても、SASのmissing関数をSQLにぶち込めちゃうところがグレートですね!
次にこれぞSASのデータステップ!!って感じで書くなら
data A2;
set Q1 end=eof;
retain XMISS YMISS ZMISS 0;
if missing(X) then XMISS+1;
if missing(Y) then YMISS+1;
if missing(Z) then ZMISS+1;
if eof;
drop X Y Z;
run;
で、結果は同じです。1行ずつ順番に読んでいくSASの正道って感じですね。
やっぱ上記のようなステップ書いてる時は、なんか居飛車、それも矢倉とか指してる感覚に似てますよね。逆にSQL書いてる時は、角交換系の振り飛車の間隔ですね。ハッシュオブジェクトもそれに近いけど、もしかしたら横歩取りの感覚かも。
僕はもちろん振り飛車党です。
結局脱線してるっていう
0 件のコメント:
コメントを投稿