概要
変数名を変更(rename)する場合、renameステートメントにひとつひとつ記載する必要がありました。2つや3つなら問題ありませんが、その数が20,30,50となってくると漏れも発生しますし何よりもコードが冗長になり、全体の可読性も下がります。これを解決するために一括変更する方法をメモしておきます。
方針
・まとめてrenameしたい変数名とrename後の変数名をマクロ変数に入れる。
・作成したマクロ変数をrenameステートメントで利用する。
実際にやってみる
テストデータ作成
/* テストデータの作成 */
data TESTDATA;
tmp_STUDYID='TEST_STUDY';
tmp_USUBJID='TEST_A00001';
tmp_SEQ=1;
x=123;
output;
tmp_STUDYID='TEST_STUDY';
tmp_USUBJID='TEST_A00002';
tmp_SEQ=2;
x=456;
output;
run;
赤線で囲んだ変数の「tmp_」を削除したい。
マクロ変数の作成
/* マクロ変数の生成 */
proc sql noprint;
select strip(name)||'='||strip(tranwrd(name, 'tmp_', ''))
into:rename_str separated by ' '
from sashelp.vcolumn
where libname = "WORK"
and memname = "TESTDATA"
and name ? 'tmp_'
;
quit;
sashelp.vcolumnでディクショナリを利用しています。
renameステートメントで利用する内容をマクロ変数に入れました。
まとめてrenameする
data RESULT;
set TESTDATA;
rename &rename_str.;
run;
無事に変更されました。変更したくない変数はそのままになっています。
マクロ化しておく
%macro rename_variable(in=, out=, str=);
proc sql noprint;
select strip(name)||'='||strip(tranwrd(name, "&str.", ''))
into:rename_str separated by ' '
from sashelp.vcolumn
where libname = "WORK"
and memname = "&in."
and name ? "&str."
;
quit;
data &out.;
set &in.;
rename &rename_str.;
run;
%mend;
%rename_variable(in=TESTDATA, out=RESULT, str=tmp_);
もちろん結果は同じです。
コメント