SAS中使用DO END可以实现执行一组语句,或者实现循环。
1. 实现执行一组语句
语法如下:
DO;
SAS statements
END;
在DO和END之间可以有多条SAS语句
2. 循环
比如有一项复利投资,每年的收益是4%,初始资金为1000元,问10年后回报是多少?
程序如下:
data tmp1;
Amount=1000;
Rate=0.04;
do year=1 to 10;
Amount+Amount*Rate;
end;
run;
proc print data=tmp1;
run;
其中do和end之间的是循环体,循环条件是year=1 to 10,即year会遍历1至10之间的所有值。最后year变成11的时候,不满足循环条件,结束。
输出如下:
Obs | Amount | Rate | year |
---|---|---|---|
1 | 1480.24 | 0.04 | 11 |
现在有一个问题就是结果数据集中只有一条观测,如果想把每一次循环时的值都存起来怎么办? 可以在循环体中加一个output语句,示例如下:
data tmp1;
Amount=1000;
Rate=0.04;
do year=1 to 10;
Amount+Amount*Rate;
output;
end;
run;
proc print data=tmp1;
run;
输出如下:
Obs | Amount | Rate | year |
---|---|---|---|
1 | 1040.00 | 0.04 | 1 |
2 | 1081.60 | 0.04 | 2 |
3 | 1124.86 | 0.04 | 3 |
4 | 1169.86 | 0.04 | 4 |
5 | 1216.65 | 0.04 | 5 |
6 | 1265.32 | 0.04 | 6 |
7 | 1315.93 | 0.04 | 7 |
8 | 1368.57 | 0.04 | 8 |
9 | 1423.31 | 0.04 | 9 |
10 | 1480.24 | 0.04 | 10 |
注意,输出中只有10条记录,Year最大值为10,其实是output语句将原来的结果覆盖了。
倒序循环条件
循环条件可以倒序的,语法为 index-variable=5 to 1 by -1,示例如下:
index-variabel为给定值
可以指定index-variable为固定某些值,示例:
注意,这些给定值可以是字符,也可以数字,如果是字符必须加引号。 多个值之间用逗号隔开。
嵌套循环
DO END可以嵌套在DO END之中,比如下面的3*3乘法表
do until和do while
循环条件可以是do until(express) 或者 do while(express)。
其中前者表示达到条件时,循环结束,这里的循环体至少执行一次(它是先执行循环体,再判断条件);
后者表示,只要满足条件,就继续循环,这里的循环体可能一次都不会执行(它是先判断条件,再执行循环体)。
例如计算从1加到100,两种方法如下:
其中while(i <= 100)表示只要 i 小于等于100,就继续循环; unilt(i > 100)表示只要 i 大于100就停止循环。