Вы можете сделать это на шаге данных или используя PROC EXPAND от SAS/ETS, если таковые имеются.
Для шага данных идея состоит в том, что вы начинаете с суммарной суммы (summ
), но отслеживаете количество значений, которые были добавлены до сих пор (ninsum
). Как только это достигнет 5, вы начнете выводить суммарную сумму в целевую переменную (juliet
), а с следующего шага вы начинаете вычитать значение запаздывания-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
Активировать мой ответ тогда было бы хорошо =) – kaytrance
Это требует 15 rep: D Sry Я новичок. И btw я не мог выполнить ваше решение. Я мог бы найти правильную переменную агрегации sql, если _n_ делится на 5, тогда count + 1, например, так легко. Я хотел бы сделать это с помощью нескольких массивов, сохранить или установить команды, если возможно – criticalth