在循环语句DO-END的内部,也可以嵌入另一个 DO-END语句,这就是嵌套循环.
例:在20年间每年增资2000元(年利率7.5%,按自复利每月计息),计算20年后资产总值. data; capital=0; do year=1 to 20; capital=2000+capital; do month= 1 to 12 ;
interest=capital*(0.075/12);
capital+interest; (等价于capital=capital+interest;) end; output; end;
run;
SAS的循环语句比上面所述还要灵活得多,在常见的步长型循环结构中,可以结合While与Until的使用来终止循环。除了上述的三种循环语句外,还有两种比较特殊的循环结构。
枚举型循环语句: DO
item-1<,…item-n> | UNTIL(expression)>; . . . more SAS statements . . . END; 这个语句是SAS比较特殊的循环结构,可以对枚举的项目依次执行,终止循环就是执行完这些列举的项目。 例如: do count=2,3,5,7,11,13,17; do month='JAN','FEB','MAR'; do i='01JAN2001'd,'25FEB2001'd,'18APR2001'd; Data ; do i=3,7, 11 to 23,30,50 by 3 while (i**2<200) ; j=i**2 ; put i= j= ; end; run; 循环变量i取3,7,11,14循环体被执行,当i取17时i的平方为289<200,故循环体不被执行,循环结束. 注意WHILE条件只作用于用逗号隔开的最后一项. 专用于数组的循环语句: DO over array-name; . . . more SAS statements . . . END; 例如: data test; input sc01-sc05; array s sc01-sc05; do over s; s= s*100; end; cards; 0.95 0.88 0.57 0.90 0.65 ; Run; 这个语句也是SAS比较特殊的循环结构,专用于数组,将数组的每一个元素访问一遍。 9.3 语句块 DO; ...more SAS statements... END; 有时候我们需要把很多语句放在一起执行,特别是放在选择结构和循环结构中,这相当于有些语言的一对{}。 9.4 如何跳出选择结构和循环体? continue语句:用于跳出当次循环,重新执行循环体并计算是否满足条件。 leave语句:用于终止循环和选择结构,不再执行循环语句而转到循环语句之后紧接的语句。 return语句:用于跳出当次data步自循环,重新执行data步。 go to语句与标号:用于跳转到指定标号的语句,但该语句要求与当前语句是在同一个data步中。在大多数情况下,使用go to语句的程序段完全可以用do;...end;程序块或者if…else结构来代替,而且使用go to语句会使程序显得复杂、难以理解和维护,所以建议还是少用。但是这个语句既然存在还是有一些用处的,可以用来跳出某些深层嵌套的结构,如跳出多层循环。 Data ; do i=3,7, 11 to 23,30,50; j=i**2 ; if (i**2>200) then goto flag1; put i= j= ; end; flag1: put \run; 课堂练习: 1.使用编程方法对class数据集进行加工: (1) 生成sex=?f?的子集 ; (2) 生成只包含name,height,weight的子集(用 数据集选项或SAS语句); (3) 增加新变量ratio=weight/height; (4) 用SELECT和OUTPUT语句把BCLASS数 据集拆分为性别为男和女的两个数据集 2. 用DO循环语句读入下列数据表: A 1 31.5 A 2 29.8 A 3 32.4 B 1 40.1 B 2 41.1 B 3 42.0 C 1 50.1 C 2 51.2 C 3 50.8 (1) 生成有3个变量(TYPE,GROUP,Y)9个观测的数 据集DABC; (2) 用条件IF语句或数据集选项where 生成只包含 TYPE=B的数据集DAC. 1.1 data class_f; set class; if sex=\ Run; 1.2 data class2 ( keep=name height weight ); set class; Run; data class2 ; set class; keep name height weight; Run; 1.3 data class3; set class; format ratio 8.4; ratio = height/weight; Run; 1.4 data classf classm; set class; select (sex); when('F') output classf; when('M') output classm; end; Run;