2014-11-17 2 views
0

У меня есть около сотни столбцов, которые я хотел бы переименовать в 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 #); 
+1

Будет ли связь между старыми именами вара и новыми именами вара ? Как и C5, было бы AR_5 или было бы, что первое новое имя var будет AR_0, независимо от того, что было старым именем var? –

+0

Нет, единственное соединение состоит в том, что они сохраняют один и тот же порядок, то есть C5 = AR_0, C7 = AR_1 и т. Д. – user2568648

ответ

1

Это немного более решение, но это довольно динамичная, и вы легко увидеть, как работают вещи. Я предполагаю, что вы будете использовать оператор переименования в наборах данных 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; 
+0

Очень полезно. Мне просто не хватает последнего шага, у меня есть таблица «Переименовать», в которой есть столбцы «имя» (текущие имена столбцов таблицы Pop09) и «new_var» (требуемые имена таблицы Pop09) - как я могу использовать это, чтобы переименовать столбцы таблицы Pop09? – user2568648

+1

Добавьте в набор данных proc, чтобы сделать окончательное «переименование». Библиотека - это библиотека, в которой хранится набор данных, а my_dataset - имя вашего набора данных. Не забывайте заявление о выходе: Посмотрите на бумагу, набор для швейцарского армейского ножа Proc Datasets для получения дополнительной информации о процедуре. – Reeza

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; 
1

Это первое найти старые столбцы и переименовать их в 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; 
Смежные вопросы