うずまき2017 powered by Jun-Systems

耳管開放症, SAS, 統計解析, 人工知能, プログラミングそれに思考

*

SASで横方向の合計を出すには PROC SQL part2

      2014/10/22

すごく簡単にできることを訓練がてらあえてすごく回りくどい方法でやります。
まさかのPROC SQL続編です。
(ちなみに前回のはSASのPROC SQLで一括操作(変数名の変更 / ダミー変数操作など))
 
たとえば、こういうデータセットでユーザごとのwebなんちゃら変数の合計を出したかったら…?
 
LIBNAME.DATASET

 
通常ならSUM(of web_:)で書けば一行で済むわけですが、あえてPROC SQLを使います。
 
ある法則性に則って変数名がついているようなものなら、1万個あっても全部まとめて取得できます。
(グローバル変数に文字制限があるので、長くなったら分割する必要はあります)
 

PROC SQL NOPRINT;
  SELECT TRIM(name) INTO:varlist SEPARATED BY '+'
  FROM sashelp.vcolumn
  WHERE LIBNAME='LIBNAME' AND
        MEMNAME='DATASET' AND
        NAME ? 'web_';
quit;

とりあえずPROC SQLを使って、足したい変数をすべて横につなぎます。
 
この場合、
すべてのライブラリのすべてのデータセットのすべての変数が格納されたデータセットsashelp.vcolumnから、 (FROMの部分)
あるライブラリ(LIBNAME)のデータセット(DATASET)内のweb_から始まる変数(name)をすべて取得して、 (WHEREの部分)
全部を「+」記号で区切りながら順番にならべていって、グローバル変数varlistに放り込む (SELECTの部分)
という指示になっています。
 
この状態で %PUT &varlist;でグローバル変数を展開するとアウトプットには…
web_0001+web_00371+web_02423+web_06482+web_08136
と表示されます。
 
これを使って…
 

DATA LIBNAME.DATASET;
  FORMAT sum_web;
  SET LIBNAME.DATASET;
  sum_web = &varlist;
run;

こうすることでグローバル変数が展開され sum_web = web_0001+web_00371+web_02423+web_06482+web_08136とサブミットされます。
余裕ができたらグローバル変数を分割するところまで書きます。
 


 - SAS Programming

Comment

  1. SASYAMA より:

    いつもツイッターと共に拝見させていただいております。SASYAMAと申します。

    今回の場合、

    data LIBNAME.DATASET;
    set LIBNAME.DATASET
    sum_web=sum(of web_:);
    run;

    で同様の結果が得られるはずです。
    +加算法の場合、1変数でも欠測があれば欠測になりますがsumであれば欠測は計算から除外されるのでこちらの方がいいかもしれません。

    ただ、敢えて欠測が含まれる場合の検知のために+でつないでいるのであれば
    data LIBNAME.DATASET;
    set LIBNAME.DATASET
    if ^cmiss(of web_:) then sum_web=sum(of web_:);
    run;

    などでいかがでしょう?

    或いは、仮に加算対象の命名規則に統一性がない場合は
    拙ブログのネタで申し訳ないのですが

    http://sas-tumesas.blogspot.jp/2013/12/blog-post.html

    のように除外対象変数以外を加算する形でどうでしょう?

    ただし、除外する変数が未確定かつ、加算対象の変数のルールが、前方一致のように単純ではない(正規表現などを使わないと特定できないようなケース)では今回ご提案の方法が活きてくると思います。

    唐突に長々と申し訳ありませんでした。見当違いな指摘になっておりましたら本コメントを削除ください

    • じゅん より:

      >SASYAMA様
      お世話になります。実はSASYAMAさんのブログは使用当初から拝見しております。
      ありがとうございます、使い始めてまだ半年の23の若造の拙い解説で大変恐縮です…

      実はずっと「なんでSUM()使えないんだ…」と思っておりました。
      使えるんですね…お恥ずかしい…SUM(of var)という文法だったとは…

      あえてPROC SQLの練習も兼ねて回りくどい方法をとったという後付けの理由とさせていただきたいと思います…
      もっと勉強したいと思います。大変助かりました、ありがとうございました。

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

no image
SASで直接twitterを検索してTLをインポート(PROC HTTP/Twitter OAuth)
no image
SAS上で走っているRとSASでのデータセットの受け渡し
no image
SASで条件分岐を使いこなす
no image
SASでHHI(ハフィンダール指数)を計算するマクロを作った
SASでランダムサンプリングしてグループ分けするマクロ
【忘備録】SASで巨大データセットから先頭100Obsを抽出
SASでカテゴリカルな変数をダミー変数化するマクロ
no image
SAS上でRを走らせよう SAS/IML
実用性重視のSASコマンド集
SASで変数リスト内の全変数に順番に同じ処理をかけていくマクロ