Вот альтернатива, не требующая сортировки. Это требует, чтобы идентификаторы были последовательными, хотя это можно обойти, если это не так.
Что он делает, это два оператора set
, который получает основные (и предыдущие) суммы и тот, который устанавливает, пока не будет найдена следующая сумма. Здесь я использую последовательность id
переменных, чтобы гарантировать, что она будет правильной записью, но вы могли бы написать это по-другому, если необходимо (отслеживать, какой цикл вы используете), если переменные id не являются последовательными или в порядке любого Сортировать.
Я использую проверку first.amount
, чтобы убедиться, что мы не пытаемся выполнить второй оператор set
больше, чем следовало бы (что рано или поздно заканчивалось).
Вам нужно сделать две вещи по-другому, если вы хотите, чтобы первая/последняя строки обрабатывались по-разному. Здесь я предполагаю, что 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;
Как вы определяющую ближайший? Для записи 5, почему это не 20/30 за 25? Ваши правила нуждаются в разъяснении. Посмотрите параметр PROC STANDARDIZE и MISSING для вариантов замены отсутствующих значений.Если ваш случай по-настоящему похож на ваш образец, выбор может быть линейной регрессией с отсутствующими значениями вмененных значений. – Reeza
Хорошая точка. Для уточнения, насколько «близко» я хотел предыдущее не пропущенное значение и следующее не пропущенное значение – User1414