Если вы хотите передать несколько значений в вызов макроса, то обычно проще всего использовать список с разделителями. Макрос может использовать функцию макроса %SCAN()
для выбора отдельных значений, если он этого хочет. Вы можете использовать функцию COUNTW()
для определения количества значений. Оберните его в макрос функции %SYSFUNC()
, чтобы использовать его в макросе c.
Поскольку вы хотите использовать значения в качестве строковых литералов в коде SAS, было бы проще всего просто попросить пользователей включить цитаты в значениях, которые они передают. То же самое, что и при записи значения в инструкции SAS.
Если у вас есть все значения одновременно, как это, вы можете использовать один шаг данных для записи всех выходных наборов данных за один проход входные данные.
%macro split(inds,prefix,values);
%local i n dsname sep;
%let n=%sysfunc(countw(&values,%str( ),q));
data
%do i=1 %do &n;
%let dsname=&prefix.&n;
&dsname.
%end;
;
set &inds ;
%do i=1 %to &n;
%let dsname=&prefix.&n;
&sep. if parameter = %scan(&values,&i,q) then output &dsname.;
%let sep=else;
%end;
run;
%mend ;
Итак, ваш пример будет вызовом, подобным этому:
%split(inds=have,prefix=want,values='param1' 'param2' ... 'param30')
Если у вас есть набор данных со списком значений, вы можете использовать простой SQL запрос для построения списка значений. Например:
proc sql noprint;
select distinct quote(trim(param),"'") into :parmlist separated by ' '
from list_of_parameters
;
quit;
И использовать эту макропеременную в вызове.
%split(inds=have,prefix=want,values=&parmlist.)
Если вы хотите, чтобы количество генерируемых наборов данных основывалось только на значениях PARAMETER, которые появляются тогда в HAVE вы можете переместить эти логи c в сам макрос и упростить пользователям макроса.
Обратите внимание , что в общем случае нет необходимости разбивать набор данных нравится. Если вы хотите использовать исходный набор данных HAVE, но использовать наблюдения только для определенного значения PARAMETER, просто используйте оператор WHERE или WHERE = набор данных.