如何将&& var& i放入if条件

时间:2018-05-30 04:37:38

标签: if-statement macros sas

/*create macro variables*/
    PROC SQL NOPRINT;
    SELECT RESTRICTIONS
    INTO :RESTRI1 - :RESTRI35 
    FROM SASDATA.RESTRICTIONLIST; 
    QUIT;
    %PUT &RESTRI2;

/*the resolved value is: */
gender = 'M' and state = 'CA'

我想在第i个限制时创建数据集sasdata.newlist&i  是&&restri&i(例如:gender = 'M'state = 'CA')。 我只想要在这个新创建的数据集

中满足限制&&restri&I*的观察结果

虽然sasdata.newlist2包含sasdata.oldlist中的所有数据,但if条件不起作用。有人可以帮我解决这个问题吗?

%Macro testing(I);
 data sasdata.newlist&i;
 set sasdata.oldlist;
 %if &&restri&i %then; 
 run;
%mend testing;
%testing(2)

2 个答案:

答案 0 :(得分:0)

您没有在适当的上下文中解析宏变量。在应用限制代码时,解决它,以便可以作为DATA步骤的一部分进行编译(数据逐步)。

%Macro testing(I);
 data sasdata.newlist&i;
 set sasdata.oldlist;

 /* %if &&restri&i %then;  NO-no-no, incorrect context */

 * apply ith restriction as a sub-setting IF statement;
 if &&restri&i;

 run;
%mend testing;
%testing(2)

答案 1 :(得分:0)

虽然很难判断何时使用宏语句,但不是。

例如:我是否需要在if -then-else语句中添加%并在下面的代码中执行while语句?那么,我可以使用" Do i = 1到n while(condition)"这边的陈述是这样的吗?

%MACRO FUNDSOURCE(I);
DATA SASDATA.STUDENT&I; 
SET SASDATA.STUDENTLIST 
DO M = 1 TO 310  WHILE(&&BUDG&I > 0); /*loop through all observations_ALL 
      STUDENTS*/
 IF &&BUDG&I LE 3000- FA_TOT1  THEN do;
      DISBURSE = &&BUDG&I;
      FA_TOT1+DISBURE;
     &&BUDG&I - DISBURSE;
 end;
 ELSE IF &&BUDG&I GT (3000- FA_TOT1)  THEN DO;
    DISBURSE = 3000-FA_TOT1;
    FA_TOT1+DISBURSE;
    &&BUDG&I - DISBURSE;
 END;
 END;
IF _n_ > M THEN DELETE; /*if budget are all gone, delete other observations, 
       keep observations only for the student who get funds*/
RUN;
%MEND FUNDSOURCE;