DO Statement, Iterative
Executes statements between the DO and END statements
repetitively, based on the value of an index variable.
Valid in: |
DATA step |
Category: |
Control |
Type: |
Executable |
Syntax
Arguments
- index-variable
-
names a variable whose
value governs execution of the DO group.
Tip:Unless you specify to drop it, the index variable is included
in the data set that is being created.
CAUTION:
Avoid changing
the index variable within the DO group.
If you modify the index
variable within the iterative DO group, you might cause infinite looping.
- specification
-
denotes an expression
or a series of expressions in this form
start <TO
stop> <BY
increment>
<WHILE(
expression) | UNTIL(
expression)>
The DO group is executed
first with
index-variable equal
to
start. The value of
start is evaluated before the first execution
of the loop.
- start
-
specifies the initial
value of the index variable.
When it is used without
TO
stop or BY
increment, the value of
start can be a series of items expressed in this form:
item-1 <, ...item-n>;
The items can be either
all numeric or all character constants, or they can be variables.
Enclose character constants in quotation marks. The DO group is executed
once for each value in the list. If a WHILE condition is added, it
applies only to the item that it immediately follows.
Requirement:When it is used with TO stop or BY increment, start must be a number or an expression that
yields a number.
- TO stop
-
specifies the ending
value of the index variable.
When both
start and
stop are present, execution continues (based on the value of
increment) until the value of
index-variable passes the value of
stop. When only
start and
increment are present,
execution continues (based on the value of
increment) until a statement directs execution out of the loop, or until a
WHILE or UNTIL expression that is specified in the DO statement is
satisfied. If neither
stop nor
increment is specified, the group executes according
to the value of
start. The
value of
stop is evaluated
before the first execution of the loop.
Requirement:Stop must be a
number or an expression that yields a number.
Tip:Any changes to stop made within the DO group do not affect the number of iterations.
To stop iteration of a loop before it finishes processing, change
the value of index-variable so that it passes the value of stop, or use a LEAVE statement to go to a statement outside the loop.
- BY increment
-
specifies a positive
or negative number (or an expression that yields a number) to control
the incrementing of index-variable.
The value of
increment is evaluated before the execution of
the loop. Any changes to the increment that are made within the DO
group do not affect the number of iterations. If no increment is specified,
the index variable is increased by 1. When
increment is positive,
start must be
the lower bound and
stop, if
present, must be the upper bound for the loop. If
increment is negative,
start must be the upper bound and
stop, if present, must be the lower bound for the loop
- WHILE(expression)
| UNTIL(expression)
-
evaluates, either before
or after execution of the DO group, any SAS expression that you specify.
Enclose the expression in parentheses.
A WHILE expression
is evaluated before each execution of the loop, so that the statements
inside the group are executed repetitively while the expression is
true. An UNTIL expression is evaluated after each execution of the
loop, so that the statements inside the group are executed repetitively
until the expression is true.
Restriction:A WHILE or UNTIL specification affects only the last
item in the clause in which it is located.
Requirement:The iterative DO statement requires at least one specification argument.
Tips:The order of the optional TO and BY clauses can be reversed.
When you use more than one specification, each one is evaluated before its execution.
Comparisons
There are three other
forms of the DO statement:
-
The DO statement, the simplest
form of DO-group processing, designates a group of statements to be
executed as a unit, usually as a part of IF-THEN/ELSE statements.
-
The DO UNTIL statement executes
statements in a DO loop repetitively until a condition is true, checking
the condition after each iteration of the DO loop.
-
The DO WHILE statement executes
statements in a DO loop repetitively while a condition is true, checking
the condition before each iteration of the DO loop.
Examples
Example 1: Using Various Forms of the Iterative DO Statement
-
These iterative DO statements use
a list of items for the value of
start:
-
do month='JAN','FEB','MAR';
-
do count=2,3,5,7,11,13,17;
-
-
-
do i='01JAN2001'd,'25FEB2001'd,'18APR2001'd;
-
These iterative DO statements use
the
start TO
stop syntax:
-
These iterative DO statements use
the BY
increment syntax:
-
-
do i=.1 to .9 by .1, 1 to 10 by 1,
20 to 100 by 10;
-
-
These iterative DO statements use
WHILE and UNTIL clauses:
-
-
do i=2 to 20 by 2 until((x/3)>y);
-
do i=10 to 0 by -1 while(month='JAN');
-
In this example, the DO loop is
executed when I=1 and I=2; the WHILE condition is evaluated when I=3,
and the DO loop is executed if the WHILE condition is true.
DO I=1,2,3 WHILE (condition);
Example 2: Using the Iterative DO Statement without Infinite Looping
In each of the following
examples, the DO group executes ten times. The first example demonstrates
the preferred approach.
/* correct coding */
do i=1 to 10;
...more SAS statements...
end;
The next example uses
the TO and BY arguments.
do i=1 to n by m;
...more SAS statements...
if i=10 then leave;
end;
if i=10 then put 'EXITED LOOP';
Example 3: Stopping the Execution of the DO Loop
In this example, setting
the value of the index variable to the current value of EXIT causes
the loop to terminate.
data iterate1;
input x;
exit=10;
do i=1 to exit;
y=x*normal(0);
/* if y>25, */
/* changing i's value */
/* stops execution */
if y>25 then i=exit;
output;
end;
datalines;
5
000
2500
;