Создайте последовательность новых имен столбцов
У меня есть около ста столбцов, которые я хотел бы переименовать в SAS, используя следующий макрос:
%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.
С помощью макроса выше, как я могу поставить эти новые имена после запятой следующего кода, не записывая каждый из них?
%rename1(C5--C205, # new names here #);
3 ответа
Это более длинное решение, но оно довольно динамичное, и вам легко увидеть, как все работает. Я предполагаю, что вы будете использовать оператор переименования в наборах данных proc. В противном случае вы можете просто быть ленивыми и использовать массивы для замены, а затем отбрасывать старые переменные, хотя это неэффективно.
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;
Сначала он найдет старые столбцы, переименует их в AR_# и создаст макропеременный список переменных, который вы можете использовать:
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;
Возможно, что-то вроде этого сделало бы работу
%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;