ソートを必要としない別の方法があります。それはIDが順番であることを必要としますが、そうでなければ回避することができます。
これは2つのset
文を使用します.1つはメイン(および前の)金額を取得し、もう1つは次の金額が見つかるまで設定します。ここでは、id
のシーケンスを使用して正しいレコードになることを保証しますが、id変数が連続していなくても、または任意の順序であれば、必要に応じてこれを書き換えることができますソート。
first.amount
チェックを使用して、2番目のset
ステートメントを実行しないようにしてください(早期に終了する必要があります)。
最初と最後の行を別々に扱いたい場合は、2つのことを別々に行う必要があります。ここでは、最初の行であればprev_amountは0であると仮定し、last_amountがないと仮定します。つまり、最後の行は最後のprev_amountを繰り返し取得し、最初の行は0とnext_amountの平均です。あなたが選択した場合、どちらか一方を別の方法で扱うことができます。私はあなたのデータを知らない。
data have;
input Id Amount;
datalines;
1 10
2 .
3 20
4 30
5 .
6 .
7 40
;;;;
run;
data want;
set have;
by amount notsorted; *so we can tell if we have consecutive missings;
retain prev_amount; *next_amount is auto-retained;
if not missing(amount) then prev_amount=amount;
else if _n_=1 then prev_amount=0; *or whatever you want to treat the first row as;
else if first.amount then do;
do until ((next_id > id and not missing(next_amount)) or (eof));
set have(rename=(id=next_id amount=next_amount)) end=eof;
end;
amount = mean(prev_amount,next_amount);
end;
else amount = mean(prev_amount,next_amount);
run;
出典
2017-02-07 17:00:35
Joe
を定義しているの?レコード5では、なぜ25分の20/30ではないのですか?あなたのルールには明確化が必要です。不足している値を置き換えるためのオプションについては、PROC STANDARDIZEおよびMISSINGオプションを参照してください。あなたのケースが本当にあなたのサンプルに似ている場合、欠損値が帰属された線形回帰が別の選択肢かもしれません。 – Reeza
良い点。明確にするために、「近く」までは、以前の欠損値と次の欠損値を欲しかった。 – User1414