Loops SAS-循环宏
我正在尝试自动化SAS中的一个过程,该过程以迭代方式改变数据集中某个变量的值,并为每个变量计算另一个变量。我试图让它作为循环中的宏工作,其中内部宏中的参数作为do循环的开始和结束 所以这看起来像:Loops SAS-循环宏,loops,sas,nested,sas-macro,Loops,Sas,Nested,Sas Macro,我正在尝试自动化SAS中的一个过程,该过程以迭代方式改变数据集中某个变量的值,并为每个变量计算另一个变量。我试图让它作为循环中的宏工作,其中内部宏中的参数作为do循环的开始和结束 所以这看起来像: %Macro Outer (variable, dataset, output, i,j); proc sql noprint; Create table &Variable._stats as Select *, min(Variable) as &Variabl
%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;
之后,我将向它添加更多内容,但目前,我正在尝试确定正确的语法,以及将循环中的计数器值作为内部宏的参数是否合适,以及如何在datastep中使用它们 如果真的想要有两个宏,您可以在
外部
之前实现内部
宏,内部循环只需调用带有参数的内部
宏即可。您忘记了数据步骤和语句中的语句。下面我试图描述这个想法,但如果没有数据样本,这很难实现
%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;
这两个似乎都是好主意,我遇到的错误是循环不会运行很多reasaon。a) 我似乎忘记了;在do和to之后,以及b)当它这样做时,它会为i和j吐出一个无效或使用不正确的错误。@cc143您能显示错误和数据样本吗,这真的很难分析。@cc143可能是您忘记了
退出之后proc sql
很不幸,我无法提取数据集,但这似乎是我在宏中调用循环变量时遇到的问题,所以我假设这是do循环的语法错误,SAS不喜欢循环的起点和终点是宏变量?是的,确实是这样,我需要为循环创建第三个参数,并使其=&I s.t.%do k=&I%到&j;%内部(&var,&in,&out,&k,&j);%结束;这似乎现在起作用了。谢谢。不要嵌套宏定义。宏的名称空间是平坦的,将定义一个宏的代码放在另一个宏中只会让您感到困惑。