SAS - 循环宏

SAS - Looping Macros

我正在尝试在 SAS 中自动执行一个过程,该过程迭代地更改数据集中变量的值并为每个变量计算另一个变量。我试图让它在循环中作为宏工作,其中内部宏中的参数被视为 do 循环的开始和结束。

所以看起来像:

%Macro Outer (variable, dataset, output, i,j);

proc sql noprint;

Create table &Variable._stats as

Select *,
       min(Variable) as &Variable._min,
       max(Variable) as &Variable._max,
       range(Variable) as &Variable._range
From   &dataset;


%do &i %to &j; 

%Macro Inner (Variable, dataset, output, &&i(???), &&j(????))

data &output;
     &Variable._stats;

&Variable._2 = &Variable - (Variable._range)*&&i/&&j;
If &Variable._2 > &Variable._max then &Variable._2 = &Variable._max;
If &Variable._2 > &Variable._min then &Variable._2 = &Variable._min;

iteration = &&i;

run;

%Mend Inner;

%Mend Outer;

之后我会向它添加更多内容,但目前,我正在尝试确定正确的语法以及将循环中的计数器值作为内部宏的参数是否合适以及如何在数据步骤中使用它们。

如果真的想有两个宏,你可以在outer之前实现inner宏,在循环内部只需要调用带参数的inner宏就可以了。你忘记了 set statement in data step and %end 声明。下面我尝试描述这个想法,但是没有数据样本很难。

%Macro Inner (Variable, dataset, output, i, j);

data &output;
     set &Variable._stats;

     &Variable._2 = &Variable - (Variable._range)*&i/&j;
     If &Variable._2 > &Variable._max then &Variable._2 = &Variable._max;
     If &Variable._2 > &Variable._min then &Variable._2 = &Variable._min;

     iteration = &i;

run;

%Mend Inner;


%Macro Outer (variable, dataset, output, i,j);

proc sql noprint;

Create table &Variable._stats as

Select *,
       min(&Variable) as &Variable._min,
       max(&Variable) as &Variable._max,
       range(&Variable) as &Variable._range
From   &dataset;
quit;


%do p=&i %to &j; 
    %inner(&variable,&dataset,&output,&i,&j);
%end;
%Mend Outer;

但如果我理解正确的话,最好使用一个宏:

%Macro Outer (variable, dataset, output, i,j);

proc sql noprint;

Create table &Variable._stats as

Select *,
       min(&Variable) as &Variable._min,
       max(&Variable) as &Variable._max,
       range(&Variable) as &Variable._range
From   &dataset;
quit;


%do p=&i %to &j; 
    data &output;
        set &Variable._stats;

        &Variable._2 = &Variable - (Variable._range)*&i/&j;
        If &Variable._2 > &Variable._max then &Variable._2 = &Variable._max;
        If &Variable._2 > &Variable._min then &Variable._2 = &Variable._min;

        iteration = &i;
    run;
%end;
%Mend Outer;