Loops SAS-循环宏

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

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

之后,我将向它添加更多内容,但目前,我正在尝试确定正确的语法,以及将循环中的计数器值作为内部宏的参数是否合适,以及如何在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);%结束;这似乎现在起作用了。谢谢。不要嵌套宏定义。宏的名称空间是平坦的,将定义一个宏的代码放在另一个宏中只会让您感到困惑。