2017-01-02 9 views
-2

次のコードが実行され、結果が間違っています。 最初の条件が確認されると、コードが正しく機能しません。 値が3のときにlag1は失われたままです... 助けてくれてありがとう。最初の条件が成立したときに条件が実行されなかった場合SAS

DATA VALUES; 
INPUT VAL caract$ var1 var2; 
DATALINES; 
1 a 12 0 
1 c 0 4 
1 c 3 2 
2 a 3 2 
2 b 15 16 
2 b 4 1 
3 a 12 13 
3 c 12 13 
4 c 14 15 
5 b 14 0 
6 b 14 15 
7 a 12 15 
7 c 12 15 
8 c 14 15 
9 c 14 5 
10 c 13 7 
; 
RUN; 

%macro lag_var(dataset, lag); 

data &dataset&lag; 
    set &dataset; 
    by VAL; 

     %do i=0 %to &lag; 
     if caract eq 'b' then 
     lag&i=lag&i(var1); 
     else lag&i = lag&i(var2); 
     %end; 

    if first.VAL then do; 
     count=0; 
     %do i=1 %to &lag; 
     lag&i=.; 
     %end; 
    end; 

    count+1; 

    %do i=1 %to &lag; 
     if (not first.VAL and count<=&i) then do; 
       lag&i=.;   
     end; 
    %end; 

    maxi = max(of lag1 - lag&lag); 
    run; 
%mend lag_var; 

%lag_var(VALUES,3); 
+1

[SAS EGのlagcalculationの問題ではなくTとしてラスを計算する - T-1]の可能な重複(http://stackoverflow.com/questions/40485127/sas-eg-lagcalculation-issue-not-calculating- las-as-tt-1) – Reeza

+0

私は、あなたが「失われたままでいる」ということを正確に理解していません。あなたのコードが正確に何をすべきか、正確には何が起こっていますか?また、ここで[良い質問をする方法](http://meta.stackexchange.com/help/how-to-ask)と[最小限で実用的で検証可能な例を書く方法]を読んでください(http:// stackoverflow .com/help/mcve) – giusti

答えて

2

必ずLAG関数の条件付き実行に関係します。遅れた値を保持するためにTEMP1とTEMP2変数を使用して、このようなものに変更してみてください。

%do i=0 %to &lag; 
    temp1=lag&i(var1); 
    temp2=lag&i(var2); 
    if caract eq 'b' then 
    lag&i=temp1; 
    else lag&i = temp2; 
    %end; 
+0

お返事ありがとうございます。 –

関連する問題