SAS中的If-Then和宏变量矛盾

时间:2016-08-21 18:51:46

标签: if-statement macros sas

以下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 

感谢您提前的时间

2 个答案:

答案 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;