SAS: Do 实现循环

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,示例如下:

SAS: Do 实现循环_第1张图片

 

index-variabel为给定值

可以指定index-variable为固定某些值,示例:

SAS: Do 实现循环_第2张图片

注意,这些给定值可以是字符,也可以数字,如果是字符必须加引号。 多个值之间用逗号隔开。

 

嵌套循环

DO END可以嵌套在DO END之中,比如下面的3*3乘法表

SAS: Do 实现循环_第3张图片

 

do until和do while

循环条件可以是do until(express) 或者 do while(express)。

其中前者表示达到条件时,循环结束,这里的循环体至少执行一次(它是先执行循环体,再判断条件);

后者表示,只要满足条件,就继续循环,这里的循环体可能一次都不会执行(它是先判断条件,再执行循环体)。

例如计算从1加到100,两种方法如下:

SAS: Do 实现循环_第4张图片

 

其中while(i <= 100)表示只要 i 小于等于100,就继续循环; unilt(i > 100)表示只要 i 大于100就停止循环。

你可能感兴趣的:(办公)