変数名をまとめて変更したい

スポンサーリンク
スポンサーリンク

概要

 変数名を変更(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_);

もちろん結果は同じです。

コメント