indsname定跡

indsname=オプションが気になっていて、面白そうだから、何かの処理に活用したいんだけど、いい使い道がわからないので教えてくださいというご連絡を匿名で直接いただきました。

手段のために目的を探すその姿勢、僕は大好きです、とても共感します。

というわけで、僕の中で定跡となっているindsnameを使った手順を紹介します

あ、ちなみに以前のindsname=の記事は
http://sas-tumesas.blogspot.jp/2013/10/indsname.html
です。



さて、今、WORKの中にたくさんのデータセットがあったとします。

data Q1;
ID='0001';output;
ID='0002';output;
ID='0003';output;
ID='0001';output;
run;

data Q2;
ID='0006';output;
ID='0002';output;
ID='0004';output;
ID='0003';output;
run;

data Q3;
ID='0005';output;
ID='0002';output;
ID='0004';output;
ID='0003';output;
run;

data Q4;
ID='0005';output;
ID='0001';output;
ID='0004';output;
ID='0003';output;
run;

data Q5;
ID='0001';output;
ID='0001';output;
ID='0001';output;
ID='0003';output;
run;


















さて、これらのデータセットの中で変数「ID」の値が0001のデータを含むデータセットの名前と
0001のデータのオブザベーション数を抽出したデータセットを作成しなさいと言われたら、
どういった処理を書くでしょうか?

要するに求めたい結果は


こんな感じです。

やり方はたくさんあると思いますが、僕はこういったケースの場合

data ALLDS;
 set Q: indsname=NAME;
  DSNAME=scan(NAME,2,'.');
run;

proc freq data=ALLDS noprint;
 tables DSNAME*ID/out=A(drop=percent ID);
 where ID='0001';
run;

こう書きます。

2ステップですが、わかりやすいです。

freqに書ける前のALLDSの中身は






















こんな感じです。


これって結構応用が利いて、
複数のデータセットを対象として、何か条件をかけて
その結果とデータセットの名前を、結果としたデータセットを作りたい時にわかりやすいです。

GLOBALのユーザー会でも、まだほとんど見かけないので、開拓の余地があるオプション
だと思います。テーマにするなら狙い目じゃないでしょうか。










2 件のコメント:

  1. SAS Utilityのブログを書いている小川と申します。
    私の備忘録的なブログで良ければ、リンクを張っていただいても構いません。
    マイナーネタばかりなので恐縮です。

    返信削除
    返信
    1. コメント有難うございます!!
      マイナーなんてとんでもないです。ログ解析等をはじめとして、SAS使い万人にとって興味深いテーマを深く探求されていて、素晴らしいと思います。今後ともよろしくお願いいたします。

      削除