1

我想使用以下代码在 SAS 中创建以下数据集 P1_31、P1_32、P1_36、P1_37

%MACRO P_MISS1;
%LET T1= 3 ;
%LET H1=1;
%DO %WHILE(&H1<=1);
        %LET TR1=%SCAN(&T1,&H1);
            %DO I= 1,2,6 %TO 7;
                DATA P1_&TR1&I;
                    VALUE=.;
                    COL&TR1=.;
                RUN;
                OUTPUT;
            %END;
     %LET H1=%EVAL(&H1+1);
 %END;
%MEND P_MISS1;

%P_MISS1

我对所有上述数据集使用了许多宏程序,但只是为了减少代码大小,我正在创建以下代码。我知道我在 %Do Loop 上做错了什么。如果有可能使用上述代码,请用代码指导我。

4

2 回答 2

3

编写此类代码的更好方法,就像任何编程语言一样,是将宏编写为您想要多次运行的部分,然后多次调用它。这使它更可重用,更清楚你在做什么,并最终在大部分时间以更短的代码结束。

这组特定的代码如何编写它的最佳方式并不完全显而易见,因为驱动您输入的因素并不明显。然而,这样的事情是有道理的。

%macro make_ds(tr,i);
DATA P1_&TR1&I;
  VALUE=.;
  COL&TR1=.;
RUN;
%mend make_ds;

%macro call_make_ds(tr);
  %make_ds(&tr,1);
  %make_ds(&tr,2);
  %make_ds(&tr,6);
  %make_ds(&tr,7);
%mend call_make_ds;

对于四个项目,如果没有包含这四个项目的数据集或其他实体,我只需将它们写出来。坦率地说,编写复杂循环的代码一样多,更容易出错,而且维护起来也不太容易。如果您有一个包含 i 的可能值的数据集,则使用它来调用%make_ds宏。

然后根据适当的参数调用该宏。例如,如果可以从数据集确定 TR(假设您有一个包含要迭代的所有 TR 值的数据集),则可以执行以下操作:

proc sql;
select distinct cats('%call_make_ds(',trval,')') into :makelist 
 separated by ' ' 
 from your_ds;
quit;
&makelist;
于 2013-10-10T13:40:21.680 回答
1

好吧,就我的 SAS 知识而言,这条线是错误的:

%DO I= 1,2,6 %TO 7;

通常,您会写:

%do macrovar=startvalue %to endvalue;

我建议您创建一个宏,其中包含要用作后缀的项目列表并循环遍历它们:

%MACRO P_MISS1;
    %let suffixes=31 32 36 37;
    %let elementNbr=1;
    %let elementValue=%scan(&suffixes.,&elementNbr.); /*initiate with first element*/

    %do %while(&elementValue. NE %str()); /*as long as we find elements, we continue iterating*/
        data P1_&elementValue.;
            value=.;
            col3=.;
            output;
        run;
        %let elementNbr=%eval(&elementNbr.+1); /*increase elementNbr, so that we look now for the next item in our list*/
        %let elementValue=%scan(&suffixes.,&elementNbr.); /*initiate next element*/
    %end;
%mend;
%P_MISS1

您似乎有两个级别:10 的倍数和单位。我在上面的代码中跳过了这个细微差别,但你可以通过嵌套这样的循环来实现它。
例如,外部循环遍历 10 的倍数(在您的情况下,这只是 nbr 30 的 3)和内部循环遍历您想要的值(在您的情况下:1、2、6 和 7)

所有这些话虽如此,我似乎错过了您的代码的重点。您正在创建空数据集,但目的是什么?你确定你需要在你的场景中拥有这些吗?

于 2013-10-10T11:26:05.353 回答