您可以在数据步骤中执行此操作,或者使用SAS/ETS中的PROC EXPAND(如果可用)。
对于数据步骤的想法是,您从累计和(summ
)开始,但记录到目前为止添加的值的数量(ninsum
)。一旦达到5,就开始输出累计和到目标变量(juliet
),并从下一步开始减去滞后5值,仅存储最后5个值的总和。
data beta;
set alpha;
retain summ ninsum 0;
summ + lima;
ninsum + 1;
l5 = lag5(lima);
if ninsum = 6 then do;
summ = summ - l5;
ninsum = ninsum - 1;
end;
if ninsum = 5 then do;
juliet = summ;
end;
run;
proc print data=beta;
run;
但是有可以做所有种类的累积,移动窗口等的计算过程:PROC扩大,其中这真的只是一条线。我们只是告诉它在宽度为5的窗口中计算向后移动的总和,并将前4个观察值设置为缺失(默认情况下,它会将您的序列在左侧扩展0)。
proc expand data=alpha out=gamma;
convert lima = juliet /transformout=(movsum 5 trimleft 4);
run;
proc print data=gamma;
run;
编辑
如果你想要做更复杂的计算,你需要携带在保留变量之前的值。我以为你想避免这种情况,但在这里它是:
data epsilon;
set alpha;
array lags {5};
retain lags1 - lags5;
/* do whatever calculation is needed */
juliet = 0;
do i=1 to 5;
juliet = juliet + lags{i};
end;
output;
/* shift over lagged values, and add self at the beginning */
do i=5 to 2 by -1;
lags{i} = lags{i-1};
end;
lags{1} = lima;
drop i;
run;
proc print data=epsilon;
run;
Thnaks,每一个岗位是appriciated。它并不那么难看。我喜欢;] – criticalth 2014-09-04 11:52:30
Upvoting我的答案然后会很好=) – kaytrance 2014-09-04 12:06:52
它需要15代表:D Sry我是新的。顺便说一句,我无法执行您的解决方案。我可以找到一个合适的sql聚合变量,如果_n_可以被5整除然后计数+ 1,那么这样做很容易。我想用几个数组来做,保留或设置命令如果可能 – criticalth 2014-09-04 12:46:12