2016-11-08 4 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が、第2インチ)のようになりました:

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 

、このようにそれを行うことができたが、今私が必要もう1つのことをやります... 179_09の合計= 1158 + 356など。つまり、累積合計値をDateでグループ化した列を追加します。

お願いします。

+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