SAS软件应用指南 第四章、第五章
第四章 数据步程序设计 数据步的程序代码一般都是顺序执行,然而,数据步中有一些控制语句,如分支、循环语句,可控制程序的执行流程。 IF 第四章 数据步程序设计 数据步的程序代码一般都是顺序执行,然而,数据步中有一些控制语句,如分支、循环语句,可控制程序的执行流程。 IF DO … END GOTO RETURN
4.1 IF 语句 两种IF语句: ●条件IF语句,带有一个THEN子句和ELSE子句(可选)。只对满足IF语句中所指定条件的观测值才执行SAS语句。如果THEN子句不被执行,那么可选择的ELSE子句给出另一种替换作用。 ●子集IF语句,无THEN子句。用来使SAS系统继续处理那些满足IF 子句中条件的观测值。
IF-THEN/ELSE语句 格式: IF expression THEN statement; <ELSE statement;> 说明: SAS系统首先对跟在IF后的表达式(expression)求值,如果结果为真(非零),则执行THEN后的语句。如果为假,则去执行ELSE后面的语句,如果没有ELSE子句,则执行下一个语句。 注意: 在THEN之后只允许使用一个语句,如果要执行几个语句,则应用DO-END把要同时执行的几个语句用括起来。 IF-THEN/ELSE 语句可以嵌套 。
4.2 GO TO (GOTO)语句 格式: GOTO label; 或 GO TO label; 说明: GO TO (或者GOTO)语句告诉SAS系统,立即跳向在GOTO语句中指出的语句, 并从那一点开始接着执行。GO TO语句和跳向的目标都必须在一个DATA步中,跳向的目标语句由GO TO语句和目标语句中的标号来标明。 label: 标识GOTO目标的语句标号。
4.3 RETURN语句 格式:RETURN; RETURN语句的功能是将当前观测值输出到数据集,然后立即将程序流程返回DATA步的开始处,而不执行其后的语句。 GO TO语句经常被DO-END语句代替。
4.4 循环 DATA _NULL_; 在数据步的一次执行中反复地执行某一部分语句,这种程序的反复执行称为循环。 I=1; 4.4 循环 在数据步的一次执行中反复地执行某一部分语句,这种程序的反复执行称为循环。 DATA _NULL_; I=1; K: PUT I; I=I+1; IF I<=10 THEN GOTO K; RUN; DO I=1 TO 10; PUT I; END;
4.4 循环 循环语句的格式: DO 指针变量=初值 TO 终值 BY 增量; END ; 说明: 4.4 循环 循环语句的格式: DO 指针变量=初值 TO 终值 BY 增量; END ; 说明: DO语句组第一次执行时,指针变量等于初值。当终值和增量都存在时,则每执行到 END语句时, 指针变量+增量作为新的指针变量,并与终值作比较,直到指针变量的值变化超过终值时才停止执行DO语句组。最后一次执行完后,指针变量值超过终值。
4.4 循环 如果仅有初值,则直到一个语句指示跳出循环体才停止循环。如果初值终值均未规定,语句组执行一次。如果未规定增量,增量的缺省值为1。初值和终值是在第一次执行循环以前计算的。
4.4 循环 DATA _NULL_; DO I=1 TO 10; PUT I=; END; RUN; 4.4 循环 DATA _NULL_; DO I=1 TO 10; PUT I=; END; RUN; PUT语句中变量名后面使用等号,是对输出值用变量名来标识。称为命名输出。 如:PUT I=;
4.4 循环 双重循环(循环嵌套): DO…; …… END; 内循环 外循环
4.4 循环 双重循环(循环嵌套): DATA _NULL_; DO I=1 TO 9; DO J=1 TO I; X=I*J; 4.4 循环 双重循环(循环嵌套): DATA _NULL_; DO I=1 TO 9; DO J=1 TO I; X=I*J; PUT @(J*5) X @; END; PUT; RUN;
4.4 循环 DATA _NULL_; DO I=1 TO 9; DO J=1 TO I; X =I*J; 4.4 循环 DATA _NULL_; DO I=1 TO 9; DO J=1 TO I; X =I*J; PUT J 1. '*' I 1. '=' X 2. +2 @; END; PUT; RUN;
4.5 其它程序设计中常用语句 4.5.1 DELETE 语句 格式:DELETE; DELETE语句告诉SAS系统停止处理当前的观测值, 且该观测值不被写入正在建立的数据集中,SAS系统返回DATA步的开始处进行下一次执行。
4.5.2求子集的IF语句 格式: IF expression; 使用求子集IF语句,使SAS系统仅继续处理符合IF语句条件规定的观测值, 因而所得到的数据集是原数据集的子集。
4.5.2求子集的IF语句 如果表达式为真(非零且不缺项),SAS系统继续为正在建立的观测值执行DATA 步中的语句。如果表达式的值是假(0或缺项),SAS系统马上返回到DATA步的开始,去进行另一次执行而不输出上一个观测值。 如: IF SEX=‘F’; 等同于(IF SEX=‘M’ THEN DELETE; 在结果数据集中所包含的仅仅是SEX的值为‘F’的那些观测值。
4.5.2求子集的IF语句 DATA A ; DATA B; INPUT NAME$ SEX$ @@; SET A; IF SEX='F'; CARDS; ZHANG F LI M SUN F WANG F LIU M ZHAO M PROC PRINT; RUN; DATA B; SET A; IF SEX='F'; PROC PRINT; RUN;
第五章 SAS文件操作 建立永久数据集:将数据集存盘 数据排序:SORT过程,将数据集中数据排序 数据集连接:SET语句,多数据集纵向连接 数据集合并:MERGE语句,多数据集横向合并 其他常用语句:PUT、FILE、OUTPUT SAS文件管理命令及过程
5.1 建立永久SAS数据集 数据库:存储在一个目录下的许多文件组成。 库标记(一级名):是SAS文件的物理存储位置(目录)。在SAS系统中为一个统一的逻辑标记。 临时库:名为WORK,它在每次启动SAS后自动生成,结束SAS后库中的数据自动删除。 永久库:使用LIBNAME语句指定永久库的库标记,永久库中的所有文件将被保留 。 启动SAS时,SAS自动指定两个库标记: SASUSER:永久库,不必用LIBNAME指定。 WORK:临时库,可省略库标记(缺省数据库)。
建立永久数据集的关键语句 LIBNAME语句 DATA 语句 建立永久数据集与建立临时数据集所用的语句基本相同,除上述二语句之外,其余语句的用法与作用均不变。
5.1.1 LIBNAME语句 格式:LIBNAME 库标记 ’目录’; 例:LIBNAME LC ’C:\EXERCISE’; 库标记:可任意起名,目录必须用引号括起来。 LIBNAME PAN ‘D:\PANYAN’; LIBNAME LA ‘A:’;
5.1.2 DATA语句 建立永久数据集: 用LIBNAME语句指定SAS库标记。 在DATA语句中写出一级和二级名(用.分隔) 例:LIBNAME LA ’A:’; DATA LA.AA; …… LIBNAME PAN ‘D:\PANYAN’; DATA PAN.ABC;
永久数据集的扩展名 SAS数据集文件的扩展名为.SD2,图标为: 。 在同一个LIBNAME语句中可定义多个库标记。 LIBNAME LA ‘A:’ LC ‘C:\’;
永久数据集的调用 调用永久数据集: LIBNAME LA ‘A:’; PROC PRINT DATA= LA.AA;
SAS使用SORT过程对数据集中的数据进行排序。 SORT过程使用如下二个语句: 5.2 数据排序 SAS使用SORT过程对数据集中的数据进行排序。 SORT过程使用如下二个语句: PROC SORT 语句 BY 语句
5.2 数据排序 5.2.1 PROC SORT 语句 格式: PROC SORT [选择项]; PROC SORT语句的选择项有二个: 5.2 数据排序 5.2.1 PROC SORT 语句 格式: PROC SORT [选择项]; PROC SORT语句的选择项有二个: DATA=规定用于排序的数据集。 OUT= 结果数据集的名称,缺省(即省略OUT=选择项),则复盖原数据集。
5.2 数据排序 5.2.2 BY 语句 格式: BY [DESCENDING] 变量 ... ; BY语句指出用以排序的变量名。 5.2 数据排序 5.2.2 BY 语句 格式: BY [DESCENDING] 变量 ... ; BY语句指出用以排序的变量名。 如果需要按BY变量值降序排列,则在变量名前要用DESCENDING指出。 如BY语句中给出多个变量,则先按前一变量值进行分组,在各组中再按后一变量值排序。
例: data score; input class num sex$ s1-s3 @@; total=sum(of s1-s3); cards; 1 1001 m 79 96 87 1 1002 f 69 78 92 2 1003 f 68 87 93 1 1004 m 88 93 90 2 1005 m 76 89 88 run;
PROC SORT DATA=SCORE OUT=CS2; BY CLASS ; PROC PRINT; RUN; BY CLASS DESCENDING TOTAL;
5.4 数据集连接 格式:SET 数据集名 …; 5.4.1 变量相同 5.4.2 变量不同 5.4 数据集连接 SET语句可以将两个或更多的数据集连在一起,形成一个单独的大的数据集。“纵向连接” 格式:SET 数据集名 …; 5.4.1 变量相同 新数据集的变量即原数据集的变量,观测值个数是各个数据集中观测值个数的和。 5.4.2 变量不同 新数据集将包括所有的变量。从某个数据集获得的观测值中,对于该数据集中没有的变量将用缺项值填充。
举例: DATA TWO; SET SCORE CS2; PROC PRINT; RUN;
举例: DATA CS1; SET SCORE; DROP NUM; RUN; DATA TWO; SET CS1 CS2; PROC PRINT;
5.4.3 交叉连接 如果两个数据集D1和D2已经按DEP值排过序,在连接两数据集时想将有相同DEP值的数据连在一起,可使用BY语句进行交叉连接。 例如: PROC SORT DATA=D1 OUT=SORTD1; BY DEP; PROC SORT DATA=D2 OUT=SORTD2; DATA D1D2; SET SORTD1 SORTD2;
5.5 数据集合并 格式:MERGE 数据集表; “横向合并” 5.5.1 一对一合并 5.5 数据集合并 MERGE语句将两个或多个SAS数据集中的观测值合并成一个新数据集中的单个的观测值。 格式:MERGE 数据集表; “横向合并” 5.5.1 一对一合并 不用BY语句时,MERGE 语句是将按观测的序号进行合并。新数据集中观测值数为 MERGE语句中所列出的各数据集中观测值数的最大者。如果某个数据集的观测值用完,则该数据集观测值各变量的值由缺项值代替。 如果一个变量在多个数据集中出现,则在新的数据集中,该变量名只出现一次。且该变量的值为在MERGE语句中列在最右边的有相应变量数据集中的值。
一对一合并举例 data student; input num name $ sex$; cards; 89100 lanyin f 89101 hanyang m 89102 sunlin f 89103 zhangli m data test; input t1-t3; cards; 89 76 90 78 88 74 96 98 92 data studtest; merge student test; proc print; run;
5.5.2 匹配合并 为实现匹配合并,对于所有要合并的数据集要求它们至少有一个变量是相同的,并且每个数据集都应按该变量排过序。BY语句被用来标识匹配变量。 对匹配变量的处理(BY变量) 匹配合并操作将从观测值具有当前BY值的每一个数据集中合并所有数据。 当一个输入数据集用尽一个BY组中的观测值时,在该BY组中的最后一个观测的值被保留且用来同其它数据集的该BY组中的剩余观测值的值合并。如果一个输入数据集不包括某一BY组中的任何观测值,则该数据集提供缺项值给新数据集。
匹配合并举例 proc print data=student; proc print data=test; data mer; input num t1-t3; cards; 89100 89 76 90 89102 78 88 74 89103 96 98 92 proc sort data=student; by num; proc sort data=test; proc print data=student; proc print data=test; data mer; merge student test; by num; proc print; run;
5.6 输出信息 在数据步中,输出信息使用PUT语句。 格式:PUT [说明]...; 5.6 输出信息 在数据步中,输出信息使用PUT语句。 格式:PUT [说明]...; [说明]描述如何将一个变量的值或一个字符串写入输出行。 变量值有三个基本输出形式: 列、列表和格式形式。还可以使用指针控制方式输出。 1. 列表形式: 在PUT 语句中,按顺序列出变量。 如: PUT NAME WEIGHT SEX; 输出时,各变量值按其长度依次列出。 2. 列形式: 在变量名后面给出输出列的范围。 如:put name 20-30 sex 1 majority 5-15;