您可以在數據步驟中執行此操作,或者使用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