2017-10-30 14 views
1

を複製することにより、私のデータは、この形式になります。転嫁欠損値前の値に

Var1 Var1 Var1 Value1 Imputer_Value1 Value2 Imputer_Value2 
    A A1 A11 6 6 15 15 
    A A1 A11 9 9 14 14 
    A A1 A12 1 1 19 19 
    A A2 A12  1 16 16 
    A A2 A13 10 10 13 13 
    A A2 A13 4 4 . 13 
    B B1 B11 8 8 13 13 
    B B1 B11 9 9 17 17 
    B B1 B12 5 5 18 18 
    B B2 B12 . 5 12 12 
    B B2 B13 2 2 20 20 
    B B2 B13 1 1 . 20 

私は上記と同じグループから前の値を複製することにより、欠損値を転嫁したいです。誰も私にそれを行う方法を教えてもらえますか?私はこのオプションに従おうとしました。しかし、これは複数の価値計算オプションを持っていません。

data imputedData; 
set mydata; 
n=_n_; 
if missing(Value1) then 
    do; 
    do until (not missing(value1)); 
    n=n-1; 
    set mydata(keep=Value1) point=n; *second SET statement; 
    end; 
end; 
run; 

ありがとうございます!

答えて

2

あなたの質問を正しく理解している場合、これを行うにはいくつかの簡単な方法があります。最も簡単にはlagと​​3210の機能を使用しています。残念ながら、lag関数は、欠損値が含まれていると予期しない結果を生じることがあります。

lagを使用した例です。それでも解決しない場合は

data want; 
set have; 
* The coalesce function returns the first non-missing value 
* and the lag function returns the last value; 
value1 = coalesce(value1, lag(value1)); 
value2 = coalesce(value2, lag(value2)); 
run; 

あなたはretainステートメントを使用する必要があります。

data want; 
set have; 
retain val1 val2; 
* If it's not the first record do; 
if _n_ > 1 then do; 
    value1 = coalesce(value1, val1); 
    value2 = coalesce(value2, val2); 
end; 
val1 = value1; 
val2 = value2; 
run; 
+0

私はあなたに非常に感謝しています!あなたは私の日付を作った。 – Beta

+0

私は、幸運を助けることができる嬉しい:) –