Как включить цикл Do внутри макроса в SAS? - PullRequest
0 голосов
/ 05 мая 2018

Ниже приведен пример набора данных, который у меня есть

data have;
input institution$ GPA;
cards;
    A   3.2
    AB  3.4
    BC  4.0
    DF  3.2
    A   4.0
    A   3.0
    A   3.5
    A   3.7
    A   3.8
    F   3.8
    D   3.2
    D   3.1
    D   3.7
;
run;

По сути, я хочу создать макрос, который выбирает случайную выборку из этого набора данных (фактический набор данных намного больше). Я также хочу смоделировать эту процедуру выборки, чтобы, например, я мог сделать 50 итераций выборки, и для каждой итерации я получил набор выходных данных. Я попытался создать следующий макрос, чтобы сделать это

%macro beta (maxj=,datain= ,numofsamples= , dataout=,);
%do j=1 %to &maxj;
proc surveyselect data=&datain
   method=srs n=&numofsamples out=&dataout_&maxj;
run;
%end;
%mend;


%beta (maxj=4 ,datain=have ,numofsamples=5,dataout=pool);

По сути, когда я запускаю это, я хочу получить выходные наборы данных, чтобы они назывались pool_1,pool_2,pool_3 etc.

Однако, когда я запускаю этот макрос, он, кажется, не делает то, что я хотел. Вместо этого он показывает, что что-то не так с &dataout_&maxj; run; строкой

1 Ответ

0 голосов
/ 06 мая 2018

Когда вы код:

&dataout_&maxj

SAS увидит макро-ссылку на макро-переменную с именем DATAOUT_ и ссылку на макро-переменную MAXJ. У вас нет макропеременной с именем DATAOUT_, поэтому ссылка не будет разрешена. У вас есть макропеременная DATAOUT без подчеркивания. И также похоже, что вы хотите макропеременную J в качестве суффикса, а не MAXJ. Таким образом, ваш макрос должен работать, если вы измените его на:

out=&dataout&j

Если вам нужно подчеркнуть подчеркивание в имени выходного набора данных, вы можете использовать точку для завершения ссылки на макропеременную:

out=&dataout._&j

Тем не менее, с PROC SURVEYSELECT вам не нужно кодировать этот цикл самостоятельно. Вы можете использовать опцию NREP, чтобы получить несколько образцов. Это должно быть намного эффективнее, чем вызывать PROC SURVEYSELECT N раз. Таким образом, ваш макрос может выглядеть так:

%macro beta (datain=, n=, reps=1, dataout=);
proc surveyselect data=&datain
   method=srs n=&n reps=&reps out=&dataout;
run;
%mend;

*Pull one sample of 5 records ;
%beta(datain=have,n=5,dataout=want)

*Pull three samples of 5 records ;
%beta(datain=have,n=5,reps=3,dataout=want)
...