0

次のマクロを使用して、SAS で名前を変更したい列が 100 ほどあります。

%macro rename1(oldvarlist, newvarlist);
  %let k=1;
  %let old = %scan(&oldvarlist, &k);
  %let new = %scan(&newvarlist, &k);
     %do %while(("&old" NE "") & ("&new" NE ""));
      rename &old = &new;
      %let k = %eval(&k + 1);
      %let old = %scan(&oldvarlist, &k);
      %let new = %scan(&newvarlist, &k);
  %end;
%mend;

現在、列の名前は C5、C7、C9、...、C205 ですが、AR_0、AR_1、...、AR100 に名前を変更したいと考えています。

上記のマクロを使用して、これらの新しい名前を、次のコードのコンマの後に、1 つずつ記述せずにどのように配置できますか?

%rename1(C5--C205, # new names here #);
4

3 に答える 3

1

これは少し長いソリューションですが、かなり動的であり、物事がどのように機能するかを簡単に確認できます。proc データセットで rename ステートメントを使用すると仮定しています。そうしないと、単に怠け者になり、配列を使用して古い変数を置き換えてから削除することができますが、それは効率的ではありません。

proc sql;
    create table oldvar as
    select name, varnum
    from sashelp.vcolumn
    where upcase(libname)='SASHELP' 
        and upcase(memname)='CLASS'
    order by varnum;
quit;

data rename;
    set oldvar;
    new_var=catx("_", "AR",varnum);
run;

proc sql noprint;
    select catx("=", name, new_var) into :rename_list 
                    separated by " "
    from rename;
quit;

%put rename &rename_list;

proc datasets library=work;
modify my_dataset;
rename &rename_list;
run;quit;
于 2014-11-17T22:07:41.630 に答える
1

これにより、最初に古い列が検出され、それらの名前が AR_# に変更され、使用できるマクロ変数 varlist が作成されます。

proc sql noprint;
    create table newvar as
    select name
    from sashelp.vcolumn
    where libname="SASHELP" and memname="CLASS"
    order by name;
quit;
data newvar;
  set newvar;
  name=compress("AR_"!!put(_n_,4.));
run;
proc sql noprint;
    select name into :varlist separated by " " 
    from newvar;
quit;
于 2014-11-18T10:36:37.037 に答える
0

おそらく、このようなものが仕事をするでしょう

%macro rename2(oldvarlist, newPrefix);
%let k=1;
%let old = %scan(&oldvarlist, &k);
  %do %while(("&old" NE ""));
    rename &old = &newPrefix.&k.;
    %let k = %eval(&k + 1);
    %let old = %scan(&oldvarlist, &k);
  %end;
%mend;
于 2014-11-17T17:40:55.973 に答える