うずまき2017 powered by Jun-Systems

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

*

SASのPROC SQLで一括操作(変数名の変更 / ダミー変数操作など)

   

SASを使い始めてそろそろ1年半でしょうか。
初めの方はその独特の頑固さに辟易していましたが、最近ではむしろこの仕様が恋しくなる時があります。

変数名を一括変更したい時というのはちょいちょいあります。
最近PROC SQLをそれなりに使えるようになってきて、忘備録もかねての投稿です。
あんまりプログラムを逐一解説しているページってあまりないんですが、自分が苦労したのでちょっと詳しく頑張ってみます。

このプログラムはSASの公式テクニカルサポートのページ『自動生成されたマクロ変数を利用して変数名を一括変更する』を参考にしています。

SASには「全てのライブラリの全てのデータセットの全ての変数」をデータセットとして格納したsashelp.vcolumnというファイルが存在します。PROC SQLでこのデータセットから特定の条件に合うものだけを抜き出すことで、一括操作が実現します。

PROC SQL NOPRINT;
  SELECT TRIM(name) INTO:varlist separated by" "
  FROM sashelp.vcolumn
  WHERE libname="testlib" AND
              memname="testdat" AND
  verify(char(name,2),'0123456789')=0;
QUIT;

今回であれば、sashelp.vcolumnから「ライブラリ名testlib」かつ「データセット名testdat」かつ「変数名の2文字目が数字」であるものだけをピックアップし、” “(=半角スペース)で区切って並べた上で、グローバル変数varlistに入れろという指示です。

%PUT &varlist;

グローバル変数に入ったので、PUTを走らせれば中身を確認できます。
&varlist = “a001 a002 a003 b001 x9924 v03 z990″みたいな感じで変数が文字でそのまま格納されます。

これを今度は条件に従って一括で操作します。
たとえば条件に従ったダミー変数を作りたいときなんていうのもあると思います。
変数が10以上なら1、そうでなければ0、とか。

ところで、変数ひとつひとつが文字で入って半角スペースで区切られているという構図は、ARRAYの中身を定義する時の方法と全く同じですね。

%MACRO allVar;
  %LET num = 20; *変数の個数を入れる;
  %DO varNum = 1 %TO #
DATA testlib.testdat;
ARRAY varname {&num} &varlist;
  SET testlib.testdat;
  IF varName[&varNum]>=10 THEN varName[&varNum]=1; ELSE varName[&varNum]=0;
run;
  %END;
%MEND;
%allVar

これで、上の変数が10以上なら1に、そうでなければ0に置換することができました。
まあこれはあくまで一例なので、これを応用していろいろできるんじゃないでしょうか。

 
 


 - SAS Programming

Message

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

  関連記事

no image
SASのPROC HTTPでe-statのAPIを叩く(叩くだけ)
no image
SASで条件分岐を使いこなす
SASでカテゴリカルな変数をダミー変数化するマクロ
no image
SAS上で走っているRとSASでのデータセットの受け渡し
no image
SASで直接twitterを検索してTLをインポート(PROC HTTP/Twitter OAuth)
no image
SASで横方向の合計を出すには PROC SQL part2
no image
SASでウェブ上のcsvファイルを直接読み込む
SASで変数リスト内の全変数に順番に同じ処理をかけていくマクロ
no image
SAS上でRを走らせよう SAS/IML
SASでランダムサンプリングしてグループ分けするマクロ