2017-01-02 46 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

感谢您的回复。 –