以下DATA步骤是SAS宏的一部分。读取数据集return_check时应检查两个条件。如果满足第一个或第二个条件,那么宏变量" Data_status"应该取字符串值'排除'。如果两个条件都不满足则宏变量" Data_status"应该采用字符串值' Include'。当我运行DATA Step时,满足第一个条件。这很明显,因为变量" 状态"在数据集中,check2具有字符串值" 排除"。然而,令人困惑的是,在DATA步骤之后,宏变量Data_status解析为" 包含"。我不确定我做错了什么。任何帮助将受到高度赞赏。
%macro analysis;
----------codes not shown--------
proc means data=temp noprint; *A prior step that produces the input dataset return_check;
var ret;
by event_id ab_:;
output out=return_check nmiss=missing_ret;
run;
data check2;
set return_check;
if Ab_M2=Ab_m1=ab_0=Ab_1=Ab_2=0 and missing_ret>(_FREQ_-50) then do; *Condition 1;
call symput('Data_status','Exclude');
Status=symget("Data_status");
end;
else if ab_M1=1 and ab_0=1 and ab_1=1 and missing_ret=1 then do; *Condition 2;
call symput('Data_status','Exclude');
Status=symget("Data_status");
end;
else do;
call symput('Data_status','Include');
Status=symget("Data_status");
end;
run;
%put &Data_status;
%if &Data_status eq %bquote(Exclude) %then %do;
%mend analysis;
----------codes not shown--------
以下是输入数据集" return_check"
的副本Ab_M2 Ab_M1 Ab_0 Ab_1 Ab_2 _TYPE_ _FREQ_ missing_ret
0 0 0 0 0 0 100 100
0 0 0 0 1 0 1 1
0 0 0 1 0 0 1 1
0 0 1 0 0 0 1 1
0 1 0 0 0 0 1 1
1 0 0 0 0 0 1 1
感谢您提前的时间
答案 0 :(得分:0)
宏变量在任何时间点只能有一个值。对于样本数据集,只有第一次观察符合状态='排除'
的条件。Ab_M2=0 Ab_M1=0 Ab_0=0 Ab_1=0 Ab_2=0 _TYPE_=0 _FREQ_=100 missing_ret=100 Status=Exclude
Ab_M2=0 Ab_M1=0 Ab_0=0 Ab_1=0 Ab_2=1 _TYPE_=0 _FREQ_=1 missing_ret=1 Status=Include
Ab_M2=0 Ab_M1=0 Ab_0=0 Ab_1=1 Ab_2=0 _TYPE_=0 _FREQ_=1 missing_ret=1 Status=Include
Ab_M2=0 Ab_M1=0 Ab_0=1 Ab_1=0 Ab_2=0 _TYPE_=0 _FREQ_=1 missing_ret=1 Status=Include
Ab_M2=0 Ab_M1=1 Ab_0=0 Ab_1=0 Ab_2=0 _TYPE_=0 _FREQ_=1 missing_ret=1 Status=Include
Ab_M2=1 Ab_M1=0 Ab_0=0 Ab_1=0 Ab_2=0 _TYPE_=0 _FREQ_=1 missing_ret=1 Status=Include
如果您只是希望它在找到符合条件的记录时停止,那么您可以简化代码。
%let data_status=Include;
data _null_;
set return_check;
if (Ab_M2=Ab_m1=ab_0=Ab_1=Ab_2=0 and missing_ret>(_FREQ_-50) )
or (ab_M1=1 and ab_0=1 and ab_1=1 and missing_ret=1 ) then do;
call symputx('Data_status','Exclude');
stop;
end;
run;
答案 1 :(得分:0)
为了克服我在初始程序中遇到的问题,我添加了一个停止语句来阻止DATA步骤在满足任何条件时进行处理,以将适当的值传递给宏变量。
data check2;
set return_check;
if Ab_M2=Ab_m1=ab_0=Ab_1=Ab_2=0 and missing_ret>(_FREQ_-50) then do; *Condition 1;
call symput('Data_status','Exclude');
Status=symget("Data_status");
stop;
end;
else if ab_M1=1 and ab_0=1 and ab_1=1 and missing_ret=1 then do; *Condition 2;
call symput('Data_status','Exclude');
Status=symget("Data_status");
stop;
end;
else call symput('Data_status','Include');
run;
%put &Data_status;