うずまき2017 powered by Jun-Systems

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

*

SASでカテゴリカルな変数をダミー変数化するマクロ

   

これ前から作ろうと思ってたんですよね。やればなんか意外と簡単にできそうな気もして。
ちょっと個人的に早急に必要になったので作ります。
カテゴリカルからダミー化するのでdummize。
 
dummize(dataset=libname.dataset,varname=変数名)でこんな変換をします。
dummize
 
注意1:整数にしか対応してません。
離散値でそんな変な値って取らないよね?
注意2:最小値は1決めます
カテゴリカルの最小値が0だったり1だったりすると思いますが最小値1にしてます。汎用化するには仕方なかった。
気に入らなければ下のスクリプトの
%DO num = 1 %TO &_max;を
%DO num = 0 %TO &_max;とかに変えてください。
 
存在しないデータセットを指定すると怒られるようにしてありますので注意してください。
あと万が一のバグなどでデータが損壊しても一切責任は取れませんので,ご了承の上必ずバックアップしたデータに走らせてください。
 

%MACRO dummize(dataset=,varname=);
%IF %SYSFUNC(EXIST(&dataset)) %THEN %DO;
  PROC SQL;
    select max(&varname) INTO:_max
    from &dataset;
  QUIT;
  %DO num = 1 %TO &_max;
    DATA &dataset;
      SET &dataset;
      IF &varname = &num THEN &varname.&num=1;
      ELSE &varname.&num=0;
    run;
  %END;
  %END;
  %ELSE %DO;
    %PUT "データセット &dataset. が存在しません。";
  %END;
%MEND;

 
PROC SQLでその変数の最大値,最小値を取得してそれぞれマクロ変数_max,_minに格納。
次に取得した_minから_maxまで順番に変数に当ててゆき,一致した数字numの時に新しい「変数num」=1を作る。
該当しない変数numには0を。
 
そんだけ。逆もまた作ります。
 
 


 - SAS, SAS Programming , ,

Message

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

  関連記事

no image
SAS上でRを走らせよう SAS/IML
【忘備録】SASで巨大データセットから先頭100Obsを抽出
実用性重視のSASコマンド集
SAS超基礎1 データの読み書き
no image
SASで条件分岐を使いこなす
no image
SASでHHI(ハフィンダール指数)を計算するマクロを作った
no image
SASで横方向の合計を出すには PROC SQL part2
SASでディレクトリ内の全フォルダを自動でライブラリに追加する
no image
データ分析の重要性とオープンデータ活用の潮流
no image
SAS上で走っているRとSASでのデータセットの受け渡し