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;
我正在尝试在 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;