Запуск макроса по всем столбцам в SAS

#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.);