プログラミングと機械学習のメモ
日付: カテゴリ: SAS
SASで数値変数名と文字変数名を取得したいことってありませんか?自分はよくあります。sgplotとか使おうとすると、_numeric_や_character_が使用できないので、全ての数値変数でグラフを描くことは難しいです。
そこで、今回は数値変数名を取得するSASコードを紹介します。
例えば、irisデータの数値変数名をマクロ変数に格納することを考えます。
実は、変数の情報はSASHELPのVCOLUMNというSASデータセットに入っています。これを使用すると数値変数名を取得することができます。
options mprint;
data iris;
set sashelp.iris;
run;
/* work.irisの数値変数名をcol1からcolnに格納*/
data _null_;
set SASHELP.VCOLUMN end=eof;
where libname="WORK" and memname="IRIS" and type="num";
count_num=put(_n_, 8. -L);
call symputx(cat("col", count_num), name);
if eof then
call symputx("n", count_num);
run;
%put _user_;
ログ(一部抜粋)
88 %put _user_; GLOBAL CLIENTMACHINE 10.0.2.2 GLOBAL COL1 SepalLength GLOBAL COL2 SepalWidth GLOBAL COL3 PetalLength GLOBAL COL4 PetalWidth GLOBAL GRAPHINIT GLOBAL GRAPHTERM GLOBAL N 4
col1からcol4に数値変数名が格納されていることがわかると思います。where分のところにはlibnameにライブラリ名、memnameにテーブル名、typeにnumかcharを入れましょう(charを指定すると文字変数を取得できます)。このとき、ライブラリ名とテーブル名は必ず大文字で書くようにしてください。
このマクロ変数を使えば、たとえばSpeciesごとの全てのヒストグラムを描くことも可能になります。
/* 数値変数全体でSpeciesで色分けされたヒストグラムを描く。 */
%macro histograms();
%do i=1 %to &N.;
proc sgplot data=iris;
histogram &&col&i.. /group=Species;
run;
%end;
%mend;
%histograms