2016-06-17 4 views
1

私の問題は次のとおりです。 - 列番号(disk_pc_nonann)から列番号(disk_pc_nonann)を作成します。SAS - 別の列から1つの列を作成するための公式

行#1の機能はdiskont_faktor = 1/disc_pc_nonannです。

行#2〜nの場合、関数はdiskont_faktor = diskont_faktor(t-1)/ disc_pc_nonannです。

私は、次のコードを試してみました:機能の遅れがコードのこの設定では動作しない理由をいくつかの特定の理由がある

data soubor2; 
     set srv.data; 
    disc_pc_nonann = (1+DISC_PC/100)**(1/12); 

    if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann; 
    else diskont_faktor = lag1(diskont_faktor)/disc_pc_nonann; 
run; 

をしかしSASは行> 1. の値を計算しないのですか?

私は成功せずも、このバージョンを試してみました:

data soubor2; 
     set srv.data; 
    disc_pc_nonann = (1+DISC_PC/100)**(1/12); 

    if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann; 
    else do; y=lag1(diskont_faktor); 
      diskont_faktor = y/disc_pc_nonann; 
     end; 
run; 

は私が間違っているの何何かアドバイスをありがとうございました。

答えて

4

LAG()関数は、以前の観測値からの値を返しません。代わりに、スタックから呼び出されたときに生成される前の値を返します。したがって、観測値の一部に対してlag()を実行するだけでは、値が適切に積み上げられていません。

これを回避する簡単な方法の1つは、LAG()関数呼び出しの値を変数に代入することです。このように、観測ごとに実行されるため、常に以前の値が返されます。 LAG()関数の値の流れを中断することなく、必要に応じて変数を条件付きで参照することができます。

lag_diskont_faktor=lag(diskont_faktor); 
if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann; 
else diskont_faktor = lag_diskont_faktor/disc_pc_nonann; 

しかし、あなたの問題では、本当にLAG()を使用する必要はないようです。 RETAINを使用して、DATAステップの次の反復を開始するときに、SASが新しい変数を不足に設定しないようにすることができます。

retain diskont_faktor; 
if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann; 
else diskont_faktor = diskont_faktor/disc_pc_nonann; 

あなたもRETAIN文で変数の初期値を設定し、コードを簡素化することができます。

retain diskont_faktor 1; 
diskont_faktor = diskont_faktor/disc_pc_nonann; 
+0

明確な説明をありがとう –

1

プログラムの開始時に変数diskont_faktorを初期化する必要があるため、最初にretain diskont_faktor;を追加してください。 lag1の最初の呼び出しによって、aが返されます。その時点でキューが空であるため、_n_ = 2の場合は、何も返さずに_n_= 1の値をキューに格納します。 _n_ = 3は動作しますが、_n_=2の空の結果をキューに格納する必要があります。 n=2の場合は結果が表示されないため、 4は何も返されません。

:あなたは私はこのwhithラグ、 を解決する方法を知っているが、私は遅れなしであなたの代替ソリューションを提供することができますいけないそうでも _n_.

ため_n_奇数なし結果の結果を持っているように、これは、延々と続きます

data soubor2 (drop=diskont_faktor_old); 
    retain diskont_faktor_old; 
    set srv.data; 
    disc_pc_nonann = (1+DISC_PC/100)**(1/12); 
    if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann; 
    else diskont_faktor = diskont_faktor_old/disc_pc_nonann; 
    diskont_faktor_old=diskont_faktor; 
run; 
関連する問題