как поместить && var & i в условие if - PullRequest
0 голосов
/ 30 мая 2018
/*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'

Я хочу создать набор данных sasdata.newlist&i, когда 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 голосов
/ 31 мая 2018

Хотя трудно сказать, когда использовать оператор макроса, когда нет.

, например: нужно ли указывать% в операторе if -then-else и делать оператор while в коде ниже?Кстати, я могу использовать здесь выражение «Do i = 1 to n while (условие)»?

%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;
0 голосов
/ 30 мая 2018

Вы не разрешаете макропеременные в правильном контексте.При применении кода ограничения разрешите его, чтобы его можно было скомпилировать (пошагово для данных) как часть шага 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)
...