#sas #sas-macro
Вопрос:
У меня есть макрос, давайте назовем его %encoding(dataset, var), который кодирует некоторую категориальную переменную (var) в данном наборе данных.
Что я хочу сделать, так это запустить этот макрос для всех символьных переменных в моем наборе данных, но я понятия не имею, как это сделать. В моем наборе много переменных, поэтому о написании его вручную не может быть и речи.
Комментарии:
1. Возможно, даже не понадобится макрос! Добавьте некоторые примеры данных с 3 тремя столбцами, которые необходимо закодировать, и покажите, как они должны быть закодированы. Возможно, вам потребуется применить только пользовательский формат или использовать массив для перебора списка переменных, которые будут обработаны. В противном случае вы можете использовать SQL dictionary.columns для создания списка переменных, которые макрос будет обрабатывать повторно с помощью цикла макроса %DO .
2. Не могу ответить без примера того, что находится в макросе. Возможно, массив имеет гораздо больше смысла, чем макросы, или использование пользовательского формата также происходит еще быстрее. Макросы, вероятно, не самый эффективный ответ, хотя и вполне выполнимый. stats.idre.ucla.edu/sas/seminars/sas-arrays
Ответ №1:
Давайте предположим, что вам нужно физически изменить все символьные переменные в этом наборе данных. Вы можете легко сделать это в data step
цикле. Специальное ключевое _CHARACTER_
слово выбирает для вас все символьные переменные. Сохраните их в массив, и вы сможете просмотреть их все.
data want;
set have;
array charvars[*] _CHARACTER_;
do i = 1 to dim(charvars);
charvars[i] = <logic goes here>;
end;
drop i;
run;
Если вам нужно сделать что-то вроде изменения форматов нескольких переменных, proc datasets
это был бы эффективный способ сделать это. Вы можете использовать тот же трюк.
proc datasets lib=libref nolist;
modify have;
format _CHARACTER_ <format here>;
quit;
Этот макрос ниже изменяет указанный список переменных, разделенных пробелами, в один указанный вами формат, но вы можете легко изменить его, чтобы связать определенные форматы с конкретными переменными в цикле макросов.
%macro encoding(data=, vars=, format=);
%let data = %upcase(amp;data.);
/* Split out libname and dataset name */
%if(%scan(amp;data., 2, .) =) %then %do;
%let lib = WORK;
%let dsn = amp;data.;
%end;
%else %do;
%let lib = %scan(amp;data., 1, .);
%let dsn = %scan(amp;data., 2, .);
%end;
proc datasets lib=amp;lib. nolist;
modify amp;dsn.;
format amp;vars. amp;format.;
quit;
%mend;
Пример:
data cars;
set sashelp.cars;
run;
%encoding(data=cars, vars=EngineSize Cylinders Horsepower, format=z5.);