2016-11-08 64 views
0

可以有一個人解決存在的問題:SAS EG lagcalculation問題,而不是計算拉斯爲T - T-1

data want; 
set have; 
by mac; 

if first.mac then do; DayDif=0; KmDif=0; end; 
     else do; 
      DayDif = Date - lag(Date); /* calculate the difference between two dates */ 
      KmDiff = Kms - lag(Kms); 
     end; 
run; 

而我得到的結果是(在第一線0,但在第二次):

Mac   Date Kms   DayDif KmDif 
SP0001  10DEC07 1885462.00000 0  0 
SP0001  12DEC07 1885462.00000 .  . 
SP0001  30APR09 1885462.00000 505  0 
SP0001  15JUL09 1886577.00000 76  1115 
SP0001  16JUL09 1887667.00000 1  1090 
SP0001  17JUL09 1889181.00000 1  1514 
SP0001  17JUL09 1888825.00000 0  -356 

. 
. 

(這裏當機器改變,滯後被取爲t - (T-2)和不爲t - (T-1))爲什麼????代碼中出現錯誤?

Machine Date Kms   DayDif KmDif 
    SP0001 01OCT14 2898108.00000 1 1059 
    SP0001 02OCT14 2899148.00000 1 1040 
    HP0001 03OCT14 2900334.00000 1 1186 
    HP0002 17JAN08 926384.00000 0 0 
    HP0002 18JAN08 926384.00000 -2450 -1973950 
    HP0002 28APR09 1237332.00000 466 310948 
    HP0002 29APR09 1238599.00000 1 1267 

回答

0

我能夠做到這一點這樣......

data want; 
set have; 
    by mac; 
     RETAIN lag_date lag_kms; 
     DROP lag_date lag_kms; 
     if first.Mac 
      then do; 
        DayDif=0; 
        KmDif=0; 
      end; 
      else do; 
       DayDif = abs(Date - lag_date); 
       KmDif = abs(Kms - lag_kms); 
     end; 
     lag_date = Date; 
     lag_kms = Kms; 
run; 

這是給我我想要的結果..

Mac    Date Kms  DayDif KmDif 
SP0001 10DEC07 1885462.00000 0   0 
SP0001 12DEC07 1885462.00000 2   0 
SP0001 30APR09 1885462.00000 505  0 
SP0001 15JUL09 1886577.00000 76  1115 
SP0001 16JUL09 1887667.00000 1   1090 
SP0001 17JUL09 1888825.00000 1   1158 
SP0001 17JUL09 1889181.00000 0   356 

但現在我需要要做更多的事情... 總計= 1158 + 356 17JUL09等等。即添加一個列,其中我們將有按日期分組的累計和值。

有什麼建議嗎?

+1

調查DIF()函數。它以相同的方式運行,但直接計算差異。 – Reeza

+0

@Reeza謝謝你的建議,我已經試過了,最後上面的解決方案,正如寫道,對於我所擁有的數據來說工作得很好。 :) – ZeekDSA

3

lag()函數的值不會從以前的觀察(一種常見的誤解).. 他們每次函數執行時間存儲在內存中(見documentation)拍攝。

在你的例子中,當機器發生變化時,由於條件邏輯(if first.mac then do/else),滯後函數沒有執行 - 所以「t-2」值僅僅是前一次迭代的結果。請嘗試以下操作:

data want; 
    set have; 
    by mac; 
    if first.mac then do; 
    DayDif=lag(Date); /* executing the lag for subsequent iteration */ 
    DayDif=0; 
    KmDif=0; 
    end; 
    else do; 
    DayDif = Date - lag(Date); /* calculate the difference between two dates */ 
    KmDiff = Kms - lag(Kms); 
    end; 
run; 
+1

感謝@RawFocus爲您提供的幫助和建議。 – ZeekDSA