@ Киран, ваше кодирование последовательного do … until
с last.group
в качестве условия завершения не работает, поскольку состояние last.group=1
сохраняется, несмотря на set;by;
во втором цикле, и, следовательно, второй цикл повторяется только один раз.
Лучшим решением, о котором долго говорил Дорфман, является шаблон размера группы вычислений первого цикла с 1 by 1
, за которым следует второй цикл с явным циклом 1 to _n_
data have; input
group ID X; datalines;
1 110 2.5
1 111 1.0
1 112 0.0
2 210 .
2 211 5.6
3 212 2.0
3 213 1.5
4 310 .
4 311 7.2
4 312 2.1
run;
data want;
do _n_ = 1 by 1 until (last.group);
set have;
by group;
groupsum = sum(groupsum,x);
end;
do _n_ = 1 to _n_ ;
set have;
output; * group related computation result gets carried into the output data set (want);
end;
run;
Часть шаблона do _n_ = 1 to _n_
становится более понятной, когда кодер понимает, что шаг данных SAS оценивает значения start , stop и на для предшествующего цикла на самом деле итерации цикла.