该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 步骤之前计算所有组的最大滞后。