1

SAS では、この便利なスニペットを使用して、このようなことを行うことができます。

%let listofvars = work.apples work.bananas work.oranges; 
%let var_no = 1;
%let var = %scan(&listofvars, &var_no, ' ');
%do %while (&var ne);
    proc sort data = &var; 
        by id;
    run; 

    %let var_no = %eval(&var_no +1);
    %let var = %scan(&listofvars, &var_no, ' ');
%end;

これらのデータセットのそれぞれを並べ替える。

スニペットをループ マクロに減らしたいので、次のようにします。

%let setlist = work.apples work.bananas work.oranges;

%macro mymacro(dataset);
    proc sort data = &dataset.
    by id;
    run;
%mend;

%loop(&setlist, mymacro); 
/*the loop macro will know to pass the &var. in as a arguement to the macro*/ 

これにより、コードの可読性が大幅に向上します。

これは可能ですか?

4

1 に答える 1

2

はい。name マクロ ルーチンは、マクロにすることができます。マクロは SAS コードを「書き込み」ます。

%macro create(dataset);
data &dataset;
do i=1 to 10;
    id=rannor(0);
    output;
end;
run;
%mend;

%macro sort(dataset);
proc sort data=&dataset;
by id;
run;
%mend;

%macro loop(list,mcr);
%local i n val ;
%let n=%sysfunc(countw(&list));
%do i=1 %to &n;
    %let val = %scan(&list,&i);
    %&mcr(&val);
%end;
%mend;  

%let sets = apples oranges pears;
options mprint;
%loop(&sets,create);
%loop(&sets,sort);
于 2013-10-17T02:36:53.300 に答える