/*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)
答案 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;