Рассмотрим случай, когда вам необходимо выполнять одно и то же действие несколько раз. Для этого удобно использовать циклы. Операторы внутри цикла Do Loop выполняются определенное количество итераций или до тех пор, пока отдельное условие не остановит цикл. Синтаксис структуры Do Loop:
DO index-variable = start TO stop BY increment;
action statement;
END;
где:
- index-variable – переменная, которая хранит значение текущей итерации цикла DO;
- start – начальное значение;
- stop – конечное значение;
- increment – шаг изменения (по умолчанию равно 1) ;
Например, выражение do i = 1 to 5; говорит SAS создать переменную i и выполнять действия, когда i равняется 1, 2, 3, 4 и 5. В случае do i = 1 to 20 by 2; выполняется также, только при каждом втором значении i (i = 1, 3, 5, 7 и т.д.).
Рассмотрим пример. В первую неделю лечения пациент принимает 14,3 mg исследуемого препарата. Каждую следующую неделю дозу увеличивают на 1,2 mg. Какой будет доза после 7 недель приема препарата?
Воспользуемся циклом для решения этой задачи:
data dose; dose=14.3; do week=2 to 7; dose+1.2; end; run;
Полученный дата сет:

В полученном дата сете можно увидеть, что индекс-переменная week сохраняется со значением на единицу больше, чем заданное конечное значение. SAS на 8 шаге итерации сравнивает значение индекс-переменной, и если оно не равно, прекращает выполнения действия dose+1.2;
Если необходимо посмотреть какая доза на каждой неделе, удобно использовать оператор output:
data each_week; dose=14.3; do week=2 to 7; dose+1.2; output; end; run;

Также вместо указания start и stop значений, можно перечислить все значения через запятую, или же указать переменную для начала и для конца:
DO index-variable = value1, value2, …valueN ; action statement; END;
Примеры:
data week_char; dose=14.3; do week='Week 2', 'Week 3', 'Week 4'; dose+1.2; output; end; run;

data week_num; dose=14.3; do week=2, 3, 4; dose+1.2; output; end; run;

data week_dose; dose=14.3; days=7; do i=2 to days; dose+1.2; output; end; run

Для того, чтобы выполнять одно и то же действие с заданным условием, можно использовать выражение WHILE (действия выполняются пока условие истинно) или UNTIL (действия выполняются до того момента, когда условие станет истинной).
DO WHILE (expression); action statement; END;
DO UNTIL (expression); action statement; END;
Рассмотрим примеры использования этих операторов:
data while; dose=14.3; do while(dose=<20); dose+1.2; step+1; output; end; run;
data until; dose=14.3; do until(dose>20); dose+1.2; step+1; output; end; run;


Вы можете использовать DO WHILE, пока условие dose=<20 выполняется. Это условие проверяется перед каждой итерацией. На шаге 5 сначала проверяется значение дозы, полученной на предыдущем шаге (dose=19.1) , условие выполняется и только тогда доза увеличивается. Но вот на шаге 6, дозе уже больше 20, поэтому цикл останавливается.
В использовании DO UNTIL проверка точно такая же, только до того момента, когда доза будет больше 20. Т.е. на 6 шаге условие dose>20 – верно, что и приводит к концу цикла.
Дополнительные материалы: