SAS Do Array
SAS Do Array
Do Loops
And
Arrays
Center of Excellence
Data Warehousing
Objectives
DATA statement;
SAS statements
DO statement;
iterated SAS statements
END statement;
SAS statements
RUN statement;
DO Loop Processing
data compound;
Amount=50000;
Rate=.075;
Yearly=Amount*Rate;
Quarterly+((Quarterly+Amount)*Rate/4);
Quarterly+((Quarterly+Amount)*Rate/4);
Quarterly+((Quarterly+Amount)*Rate/4);
Quarterly+((Quarterly+Amount)*Rate/4);
run;
Repetitive Coding
data compound(drop=Qtr);
Amount=50000;
Rate=.075;
Yearly=Amount*Rate;
do Qtr=1 to 4;
Quarterly+(Quarterly+Amount)*Rate/4;
end;
run;
The Iterative DO Statement
DO
DO index-variable=specification-1
index-variable=specification-1 <,…specification-n>;
<,…specification-n>;
<additional
<additionalSAS
SASstatements>
statements>
END;
END;
DO
DO index-variable=start
index-variable=start TO
TO stop
stop<BY
<BY increment>;
increment>;
...
The Iterative DO Statement
DO
DOindex-variable=item-1
index-variable=item-1<,…item-n>;
<,…item-n>;
...
DO Loop Logic
do
do index=start
index=start to to stop
stop
DO loops
by iterate within
increment; the normal looping process of
by increment;
the DATA step.
SAS-statements
SAS-statements
end;
end;
Initialize
Initialize
PDV
PDV
Execute
Execute EOF
"read"
"read"statement
statement marker?
Execute NO
Execute
program
programstatements
statements
...
DO Loop Logic
do
do index=start
index=start to to stop
stop Define start,
DO byloops iterate within
by increment;
increment;
the
stop,normal looping
and increment
process of the DATA step.
SAS-statements
SAS-statements values. Set
end; INDEX=start.
end;
Initialize
Initialize
PDV
PDV
YES Is INDEX
Execute
Executeadditional
additional out of
program
programstatements
statements range?
NO
Output
Outputobservation
observationto
to
SAS
SASdata
dataset
set Execute
Executestatements
statementsin
inloop
loop
INDEX=INDEX+increment
INDEX=INDEX+increment
...
DO Loop Logic
YES Stop
Execute
Execute EOF
“read” DATA
“read”statement
statement marker?
step
...
Performing Repetitive Calculations
data invest;
do Year=2001 to 2003;
Capital+5000;
Capital+(Capital*.075);
end;
run;
Execute data invest;
do Year=2001 to 2003;
Capital+5000;
Capital+(Capital*.075);
end;
run;
PDV
D
YEAR CAPITAL _N_
...
data invest;
do Year=2001 to 2003;
Capital+5000;
Capital+(Capital*.075);
end;
run;
PDV
D
YEAR CAPITAL _N_
. 0 1
...
data invest;
do Year=2001 to 2003;
Capital+5000;
Capital+(Capital*.075);
end;
run;
PDV
D
YEAR CAPITAL _N_
2001 0 1
...
data invest;
do Year=2001 to 2003;
Capital+5000;
Capital+(Capital*.075);
end;
run;
PDV
0+5000
D
YEAR CAPITAL _N_
2001 5000 1
...
data invest;
do Year=2001 to 2003;
Capital+5000;
Capital+(Capital*.075);
end;
run;
PDV
5000+(5000*.075)
D
YEAR CAPITAL _N_
2001 5375 1
...
data invest;
do Year=2001 to 2003;
Capital+5000;
Capital+(Capital*.075);
end;
run;
Year + 1
PDV
D
YEAR CAPITAL _N_
2002 5375 1
...
data invest;
do Year=2001 to 2003;
Is Year Capital+5000;
out of Capital+(Capital*.075);
end;
range? run;
PDV
D
YEAR CAPITAL _N_
2002 5375 1
...
data invest;
do Year=2001 to 2003;
Capital+5000;
Capital+(Capital*.075);
end;
run;
PDV
5375+5000
D
YEAR CAPITAL _N_
2002 10375 1
...
data invest;
do Year=2001 to 2003;
Capital+5000;
Capital+(Capital*.075);
end;
run;
PDV
10375+(10375*.075)
D
YEAR CAPITAL _N_
2002 11153.13 1
...
data invest;
do Year=2001 to 2003;
Capital+5000;
Capital+(Capital*.075);
end;
run;
Year + 1
PDV
D
YEAR CAPITAL _N_
2003 11153.13 1
...
data invest;
do Year=2001 to 2003;
Is Year Capital+5000;
out of Capital+(Capital*.075);
end;
range? run;
PDV
D
YEAR CAPITAL _N_
2003 11153.13 1
...
data invest;
do Year=2001 to 2003;
Capital+5000;
Capital+(Capital*.075);
end;
run;
PDV
10375.13+5000
D
YEAR CAPITAL _N_
2003 16153.13 1
...
data invest;
do Year=2001 to 2003;
Capital+5000;
Capital+(Capital*.075);
end;
run;
PDV
16153.13+(16153.13*.075)
D
YEAR CAPITAL _N_
2003 17364.61 1
...
data invest;
do Year=2001 to 2003;
Capital+5000;
Capital+(Capital*.075);
end;
run;
Year + 1
PDV
D
YEAR CAPITAL _N_
2004 17364.61 1
...
data invest;
do Year=2001 to 2003;
Is Year Capital+5000;
out of Capital+(Capital*.075);
end;
range? run;
PDV
D
YEAR CAPITAL _N_
2004 17364.61 1
...
data invest;
do Year=2001 to 2003;
Capital+5000;
Capital+(Capital*.075);
end;
run;
PDV
D
YEAR CAPITAL _N_
2004 17364.61 1
...
data invest;
do Year=2001 to 2003;
Capital+5000;
Capital+(Capital*.075);
end;
run;
Implied output
PDV
D
YEAR CAPITAL _N_
2004 17364.61 1
Write out observation to invest.
...
Performing Repetitive Calculations
2004 17364.61
Performing Repetitive Calculations
Generate a separate observation for each year.
data invest;
do Year=2001 to 2003;
Capital+5000;
Capital+(Capital*.075);
output;
end;
run;
2001 5375.00
2002 11153.13
2003 17364.61
Num
Division Emps Increase
set prog2.growth(rename=(NumEmps=NewTotal));
do Year=1 to 3;
NewTotal=NewTotal*(1+Increase);
Reducing Redundant Code
data invest;
do until(Capital>1000000);
Year+1;
Capital+5000;
Capital+(Capital*.075);
end;
run;
Capital Year
1047355.91 38
DO
DO index-variable=start
index-variable=start TO
TO stop
stop<BY
<BY increment>
increment>
WHILE
WHILE || UNTIL
UNTIL(expression);
(expression);
<additional
<additionalSAS
SASstatements>
statements>
END;
END;
data invest;
do Year=1 to 25
until(Capital>250000);
Capital+5000;
Capital+(Capital*.075);
end;
run;
Year Capital
21 255594.86
Nested DO Loops
data invest(drop=Quarter);
do Year=1 to 5;
Capital+5000;
5x 4x
do Quarter=1 to 4;
Capital+((.075/4)*Capital);
end;
output;
end;
run;
Year Capital
1 5385.68
2 11186.79
3 17435.37
4 24165.94
5 31415.68
prog2.Banks
Name Rate
E00224 12 33 22 .
E00367 35 48 40 30
Performing Repetitive Calculations
data charity;
set prog2.donate;
Qtr1=Qtr1*1.25;
Qtr2=Qtr2*1.25;
Performing Repetitive Calculations
A SAS array
is a temporary grouping of SAS variables that are arranged in
a particular order
is identified by an array name
exists only for the duration of the current DATA step
is not a variable.
What Is a SAS Array?
Array references
...
The ARRAY Statement
ARRAY
ARRAYarray-name
array-name{subscript}
{subscript}<$><length>
<$><length>
<array-elements>
<array-elements><(initial-value-list)>;
<(initial-value-list)>;
The ARRAY Statement
CONTRIB
CONTRIB
...
Defining an Array
CONTRIB2
CONTRIB2
...
Processing an Array
Array processing often occurs within DO loops. An iterative DO
loop that processes an array has the following form:
DO
DO index-variable=1
index-variable=1TO
TO number-of-elements-in-array;
number-of-elements-in-array;
additional
additionalSAS
SASstatements
statements
using
usingarray-name{index-variable}…
array-name{index-variable}…
END;
END;
Value of CONTRIB{QTR}
CONTRIB{QTR}
index array
variable Qtr reference
1 2 3 4
CONTRIB{1} CONTRIB{2} CONTRIB{3} CONTRIB{4}
QTR1 QTR2 QTR3 QTR4
setContrib{1}=Contrib{1}*1.25;
prog2.donate;
Qtr1=Qtr1*1.25;
do Qtr=1 to 4;
...
Performing Repetitive Calculations
data charity(drop=Qtr);
setContrib{2}=Contrib{2}*1.25;
prog2.donate;
Qtr2=Qtr2*1.25;
do Qtr=1 to 4;
...
Performing Repetitive Calculations
data charity(drop=Qtr);
setContrib{3}=Contrib{3}*1.25;
prog2.donate;
Qtr3=Qtr3*1.25;
do Qtr=1 to 4;
...
Performing Repetitive Calculations
data charity(drop=Qtr);
setContrib{4}=Contrib{4}*1.25;
prog2.donate;
Qtr4=Qtr4*1.25;
do Qtr=1 to 4;
...
Performing Repetitive Calculations
E00224 12 33 22 .
E00367 35 48 40 30
Creating Variables with Arrays
data percent(drop=Qtr);
set prog2.donate;
Total=sum(of Qtr1-Qtr4);
array Contrib{4} Qtr1-Qtr4;
array Percent{4};
do Qtr=1 to 4;
Percent{Qtr}=Contrib{Qtr}/Total;
end;
run;
E00224 12 33 22 .
First Third
E00367 35 48 40 30
difference difference
When i=1
Diff1=Qtr2-Qtr1;
...
Creating Variables with Arrays
data change(drop=i);
set prog2.donate;
array Contrib{4} Qtr1-Qtr4;
array Diff{3};
do i=1 to 3;
Diff{i}=Contrib{i+1}-Contrib{i};
Diff{2}=Contrib{3}-Contrib{2};
end;
run;
When i=2
Diff2=Qtr3-Qtr2;
...
Creating Variables with Arrays
data change(drop=i);
set prog2.donate;
array Contrib{4} Qtr1-Qtr4;
array Diff{3};
do i=1 to 3;
Diff{i}=Contrib{i+1}-Contrib{i};
Diff{3}=Contrib{4}-Contrib{3};
end;
run;
When i=3
Diff3=Qtr4-Qtr3;
...
Creating Variables with Arrays
E00224 21 -11 .
E00367 13 -8 -10
E00441 . 26 1
E00587 3 11 -1
E00598 4 -2 -5
Assigning Initial Values
PDV
...
Partial Listing of prog2.donate
ID Qtr1 Qtr2 Qtr3 Qtr4 data compare(drop=Qtr Goal1-Goal4);
set prog2.donate;
E00224 12 33 22 . array Contrib{4} Qtr1-Qtr4;
E00367 35 48 40 30 array Diff{4};
array Goal{4} Goal1-Goal4
(10,15,5,10);
do Qtr=1 to 4;
Diff{Qtr}=Contrib{Qtr}-
Goal{Qtr};
end;
run;
PDV
ID QTR1 QTR2 QTR3 QTR4
...
Partial Listing of prog2.donate
ID Qtr1 Qtr2 Qtr3 Qtr4 data compare(drop=Qtr Goal1-Goal4);
set prog2.donate;
E00224 12 33 22 . array Contrib{4} Qtr1-Qtr4;
E00367 35 48 40 30 array Diff{4};
array Goal{4} Goal1-Goal4
(10,15,5,10);
do Qtr=1 to 4;
Diff{Qtr}=Contrib{Qtr}-
Goal{Qtr};
end;
run;
PDV
ID QTR1 QTR2 QTR3 QTR4 DIFF1 DIFF2
DIFF3 DIFF4
...
Partial Listing of prog2.donate
ID Qtr1 Qtr2 Qtr3 Qtr4 data compare(drop=Qtr Goal1-Goal4);
set prog2.donate;
E00224 12 33 22 . array Contrib{4} Qtr1-Qtr4;
E00367 35 48 40 30 array Diff{4};
array Goal{4} Goal1-Goal4
(10,15,5,10);
do Qtr=1 to 4;
Diff{Qtr}=Contrib{Qtr}-
Goal{Qtr};
end;
run;
PDV
ID QTR1 QTR2 QTR3 QTR4 DIFF1 DIFF2
...
Partial Listing of prog2.donate
ID Qtr1 Qtr2 Qtr3 Qtr4 data compare(drop=Qtr Goal1-Goal4);
set prog2.donate;
E00224 12 33 22 . array Contrib{4} Qtr1-Qtr4;
E00367 35 48 40 30 array Diff{4};
array Goal{4} Goal1-Goal4
(10,15,5,10);
do Qtr=1 to 4;
Diff{Qtr}=Contrib{Qtr}-
Goal{Qtr};
end;
run;
PDV
ID QTR1 QTR2 QTR3 QTR4 DIFF1 DIFF2
...
Partial Listing of prog2.donate
ID Qtr1 Qtr2 Qtr3 Qtr4 data compare(drop=Qtr Goal1-Goal4);
set prog2.donate;
E00224 12 33 22 . array Contrib{4} Qtr1-Qtr4;
E00367 35 48 40 30 array Diff{4};
array Goal{4} Goal1-Goal4
(10,15,5,10);
do Qtr=1 to 4;
Diff{Qtr}=Contrib{Qtr}-
Goal{Qtr};
end;
run;
PDV
ID QTR1 QTR2 QTR3 QTR4 DIFF1 DIFF2
D D D D D
DIFF3 DIFF4 GOAL1 GOAL2 GOAL3 GOAL4 QTR
...
Assigning Initial Values
E00224 2 18 17 .
E00367 25 33 35 20
E00441 . 48 84 80
E00587 6 4 25 19
E00598 -6 -7 1 -9
Performing a Table Lookup
E00224 2 18 17 .
E00367 25 33 35 20
E00441 . 48 84 80
E00587 6 4 25 19
E00598 -6 -7 1 -9
Rotating a SAS Data Set
E00224 12 33 22 .
E00367 35 48 40 30
Rotating a SAS Data Set
E00224 12 33 22 .
E00367 35 48 40 30 Partial Listing of rotate
ID Qtr Amount
E00224 1 12
E00224 2 33
E00224 3 22
E00224 4 .
E00367 1 35
E00367 2 48
E00367 3 40
E00367 4 30
Rotating a SAS Data Set
data rotate(drop=Qtr1-Qtr4);
set prog2.donate;
array Contrib{4} Qtr1-Qtr4;
do Qtr=1 to 4;
Amount=Contrib{Qtr};
output;
end;
run;
Partial Listing of prog2.donate
ID Qtr1 Qtr2Execute
Qtr3 Qtr4 data rotate(drop=Qtr1-Qtr4);
set prog2.donate;
E00224 12 33 22 . array Contrib{4} Qtr1-Qtr4;
E00367 35 48 40 30 do Qtr=1 to 4;
Amount=Contrib{Qtr};
Partial Listing of rotate output;
ID Qtr Amount end;
run;
PDV
D D D D
ID QTR1 QTR2 QTR3 QTR4 QTR AMOUNT
...
Partial Listing of prog2.donate
ID Qtr1 Qtr2 Qtr3 Qtr4 data rotate(drop=Qtr1-Qtr4);
set prog2.donate;
E00224 12 33 22 . array Contrib{4} Qtr1-Qtr4;
E00367 35 48 40 30 do Qtr=1 to 4;
Amount=Contrib{Qtr};
Partial Listing of rotate output;
ID Qtr Amount end;
run;
PDV
D D D D
ID QTR1 QTR2 QTR3 QTR4 QTR AMOUNT
. . . . . .
...
Partial Listing of prog2.donate
ID Qtr1 Qtr2 Qtr3 Qtr4 data rotate(drop=Qtr1-Qtr4);
set prog2.donate;
E00224 12 33 22 . array Contrib{4} Qtr1-Qtr4;
E00367 35 48 40 30 do Qtr=1 to 4;
Amount=Contrib{Qtr};
Partial Listing of rotate output;
ID Qtr Amount end;
run;
PDV
D D D D
ID QTR1 QTR2 QTR3 QTR4 QTR AMOUNT
E00224 12 33 22 . . .
...
Partial Listing of prog2.donate
ID Qtr1 Qtr2 Qtr3 Qtr4 data rotate(drop=Qtr1-Qtr4);
set prog2.donate;
E00224 12 33 22 . array Contrib{4} Qtr1-Qtr4;
E00367 35 48 40 30 do Qtr=1 to 4;
Amount=Contrib{Qtr};
Partial Listing of rotate output;
ID Qtr Amount end;
run;
PDV
D D D D
ID QTR1 QTR2 QTR3 QTR4 QTR AMOUNT
E00224 12 33 22 . . .
...
Partial Listing of prog2.donate
ID Qtr1 Qtr2 Qtr3 Qtr4 data rotate(drop=Qtr1-Qtr4);
set prog2.donate;
E00224 12 33 22 . array Contrib{4} Qtr1-Qtr4;
E00367 35 48 40 30 do Qtr=1 to 4;
Amount=Contrib{Qtr};
Partial Listing of rotate output;
ID Qtr Amount end;
run;
PDV
D D D D
ID QTR1 QTR2 QTR3 QTR4 QTR AMOUNT
E00224 12 33 22 . 1 .
...
Partial Listing of prog2.donate
ID Qtr1 Qtr2 Qtr3 Qtr4 data rotate(drop=Qtr1-Qtr4);
set prog2.donate;
E00224 12 33 22 . array Contrib{4} Qtr1-Qtr4;
E00367 35 48 40 30 do Qtr=1 to 4;
Amount=Contrib{Qtr};
Partial Listing of rotate output;
ID Qtr Amount end;
run;
Amount=Contrib{1};
PDV
D D D D
ID QTR1 QTR2 QTR3 QTR4 QTR AMOUNT
E00224 12 33 22 . 1 12
.
...
Partial Listing of prog2.donate
ID Qtr1 Qtr2 Qtr3 Qtr4 data rotate(drop=Qtr1-Qtr4);
set prog2.donate;
E00224 12 33 22 . array Contrib{4} Qtr1-Qtr4;
E00367 35 48 40 30 do Qtr=1 to 4;
Amount=Contrib{Qtr};
Partial Listing of rotate output;
ID Qtr Amount end;
run;
E00224 1 12
PDV
D D D D
ID QTR1 QTR2 QTR3 QTR4 QTR AMOUNT
E00224 12 33 22 . 1 12
Write out observation to rotate. ...
Partial Listing of prog2.donate
ID Qtr1 Qtr2 Qtr3 Qtr4 data rotate(drop=Qtr1-Qtr4);
set prog2.donate;
E00224 12 33 22 . array Contrib{4} Qtr1-Qtr4;
E00367 35 48 40 30 do Qtr=1 to 4;
Amount=Contrib{Qtr};
Partial Listing of rotate output;
ID Qtr Amount end;
run;
E00224 1 12
Amount=Contrib{2};
PDV
D D D D
ID QTR1 QTR2 QTR3 QTR4 QTR AMOUNT
E00224 12 33 22 . 2 12
33
...
Partial Listing of prog2.donate
ID Qtr1 Qtr2 Qtr3 Qtr4 data rotate(drop=Qtr1-Qtr4);
set prog2.donate;
E00224 12 33 22 . array Contrib{4} Qtr1-Qtr4;
E00367 35 48 40 30 do Qtr=1 to 4;
Amount=Contrib{Qtr};
Partial Listing of rotate output;
ID Qtr Amount end;
run;
E00224 1 12
E00224 2 33
PDV
D D D D
ID QTR1 QTR2 QTR3 QTR4 QTR AMOUNT
E00224 12 33 22 . 2 33
Write out observation to rotate. ...
Partial Listing of prog2.donate
ID Qtr1 Qtr2 Qtr3 Qtr4 data rotate(drop=Qtr1-Qtr4);
set prog2.donate;
E00224 12 33 22 . array Contrib{4} Qtr1-Qtr4;
E00367 35 48 40 30 do Qtr=1 to 4;
Amount=Contrib{Qtr};
Partial Listing of rotate output;
ID Qtr Amount end;
run;
E00224 1 12
E00224 2 33
Amount=Contrib{3};
PDV
D D D D
ID QTR1 QTR2 QTR3 QTR4 QTR AMOUNT
E00224 12 33 22 . 3 33
22
...
Partial Listing of prog2.donate
ID Qtr1 Qtr2 Qtr3 Qtr4 data rotate(drop=Qtr1-Qtr4);
set prog2.donate;
E00224 12 33 22 . array Contrib{4} Qtr1-Qtr4;
E00367 35 48 40 30 do Qtr=1 to 4;
Amount=Contrib{Qtr};
Partial Listing of rotate output;
ID Qtr Amount end;
run;
E00224 1 12
E00224 2 33
E00224 3 22
PDV
D D D D
ID QTR1 QTR2 QTR3 QTR4 QTR AMOUNT
E00224 12 33 22 . 3 22
Write out observation to rotate. ...
Partial Listing of prog2.donate
ID Qtr1 Qtr2 Qtr3 Qtr4 data rotate(drop=Qtr1-Qtr4);
set prog2.donate;
E00224 12 33 22 . array Contrib{4} Qtr1-Qtr4;
E00367 35 48 40 30 do Qtr=1 to 4;
Amount=Contrib{Qtr};
Partial Listing of rotate output;
ID Qtr Amount end;
run;
E00224 1 12
E00224 2 33
Amount=Contrib{4};
E00224 3 22
PDV
D D D D
ID QTR1 QTR2 QTR3 QTR4 QTR AMOUNT
E00224 12 33 22 . 4 22
.
...
Partial Listing of prog2.donate
ID Qtr1 Qtr2 Qtr3 Qtr4 data rotate(drop=Qtr1-Qtr4);
set prog2.donate;
E00224 12 33 22 . array Contrib{4} Qtr1-Qtr4;
E00367 35 48 40 30 do Qtr=1 to 4;
Amount=Contrib{Qtr};
Partial Listing of rotate output;
ID Qtr Amount end;
run;
E00224 1 12
E00224 2 33
E00224 3 22
E00224 4 .
PDV
D D D D
ID QTR1 QTR2 QTR3 QTR4 QTR AMOUNT
E00224 12 33 22 . 4 .
Write out observation to rotate. ...
Partial Listing of prog2.donate
ID Qtr1 Qtr2 Qtr3 Qtr4 data rotate(drop=Qtr1-Qtr4);
set prog2.donate;
E00224 12 33 22 . array Contrib{4} Qtr1-Qtr4;
E00367 35 48 40 30 do Qtr=1 to 4;
Amount=Contrib{Qtr};
Partial Listing of rotate output;
ID Qtr Amount end;
run;
E00224 1 12
E00224 2 33 Implicit return. Continue
E00224 3 22
processing observations from
E00224 4 .
prog2.donate.
PDV
D D D D
ID QTR1 QTR2 QTR3 QTR4 QTR AMOUNT
E00224 12 33 22 . 5 .
c07s3d1.sas ...
...
Questions