Функция LAG<n>
- это встроенный стек фиксированной глубины, который зависит от места использования кода и, следовательно, состояния шага при вызове.Стек имеет глубину и не может быть динамически изменен во время выполнения.
Динамическое запаздывание может быть реализовано на этапе SAS DATA с использованием хеш-объекта.Техника двойного DOW позволяет измерять группу, а затем обрабатывать ее элементы.
Пример кода
В этом примере используется объект hash
, который поддерживает стек значений в пределахгруппа.Первый цикл DOW вычисляет максимум поля, которое становится динамической высотой стека.Второй цикл DOW выполняет итерации группы и извлекает значение задержки, а также создает стек для будущих задержек элементов.
* some faux data;
data have (keep=group value duration);
do group = 1 to 10;
limit = ceil(4 * ranuni(6));
put group= limit=;
do _n_ = 1 to 8 + 10*ranuni(123);
value = group*10 + _n_;
duration = 1 + floor(limit*ranuni(123));
output;
end;
end;
run;
* dynamic lag provided via hash;
data want;
if _n_ = 1 then do;
retain index lag_value .;
declare hash lag_stack();
lag_stack.defineKey('index');
lag_stack.defineData('lag_value');
lag_stack.defineDone();
end;
do _n_ = 1 by 1 until (last.group);
set have;
by group;
max_duration = max(max_duration, duration);
end;
* max_duration within group is the lag lag_stack height;
* pre-fill missings ;
do index = 1-max_duration to 0;
lag_stack.replace(key: index, data: .);
end;
do _n_ = 1 to _n_;
set have;
lag_stack.replace(key: _n_, data: value);
lag_stack.find(key: _n_ - max_duration);
output;
end;
drop index;
run;
Другой метод будет включать кольцевой массив фиксированной длины вместо хеш-стека,но вам необходимо вычислить максимальную задержку по всем группам до кодирования шага DATA с использованием массива.