2016-08-21 10 views
0

以下のDATAステップは、SASマクロの一部です。データセットreturn_checkを読み取るときにチェックする必要がある2つの条件があります。第1または第2の条件が満たされる場合、マクロ変数「Data_status」は文字列値「Exclude」を取るべきである。いずれの条件も満たされない場合、マクロ変数 "Data_status"は文字列値 'Include'を取るべきです。データステップを実行すると、最初の条件が満たされます。これは、データセットcheck2の変数 "Status"が文字列値 "Exclude"を持っていることから明らかです。しかし、ここで私が困惑しているのは、DATAステップの後で、マクロ変数Data_statusが "Include"に解決されるということです。私は何が間違っているのか分かりません。どんな助力も高く評価されます。ここでSASのIf-Thenとマクロ変数の矛盾

%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-------- 

は、事前にお時間を

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

問題を再現できるサンプルデータセットを提供してください。 – user667489

+0

プログラムは、入力データセットの最後の観測での変数値に基づいてマクロ変数を設定しています。 – Tom

+0

あなたの提案user667489に感謝します。入力データセットを追加しました。 –

答えて

0

はマクロ変数が唯一の任意の時点で一つの値を持つことができ、入力データセット「return_check」のコピーです。あなたのサンプルデータセットについては、最初の観測のみがStatus = 'Exclude'の条件を満たします。

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; 
+0

Data Setがどのようにデータセットを処理するかについての光を捨ててくれてありがとう@Tom。この問題はコードにはなく、最初のものだけでなく、すべての観測で条件がテストされることを覚えていないのです。私の目的を達成するために、条件を満たしていればDATAステップが停止し、マクロ変数に目的の値が格納されるようにコードを修正しました。 –

0

Iは初期プログラムに直面する問題を克服するために、私は、条件のいずれかがマクロ変数に適切な値を渡すために、満たされたときの処理からのデータステップを停止する停止ステートメントを追加しました。

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;