1、 很全的 sas 基础知识(一) 5.1 SAS 表达式简介 SAS 常数表达式 (1)数值常数 如 : 1.23、 -5、 0.5E-10。 (2)字符常数 如 : name1=TOME、 name2=MARY、 name3=JOHN。 (3)日期 (d)、时间 (t)、日时 (dt)常数 如 : d1=01JAN80d、 t1=9:25:19t、 dt1=18JAN80:9:27:05dt。 (4)16 进制常数 (略 ) SAS 运算符 (1)前缀算符与后缀算符 前缀算符 , 即正号或负号 ; 如 : +Y; -25; -COS(30); +(X*Y); 后缀算符 ,即两个运算对 象之间
2、的运算符号 , 如 : 1+9; 4-2; 6 NOT MIN MAX 逻辑非 , 最小 , 最大 第 2 组 * / 乘 , 除 第 3 组 + - 加 , 减 第 4 组 或 | 字串连接 第 5 组 = GE GT 大于等于 , 大于 IN 等于一列元数中的某一个 第 6 组 其他各组均自左至右。第 4 组和第 7 组都给出了 两种运算符号 , 这是因为不同的系统可能只认识其中的某一种 5.2 SAS 函数简介 SAS 软件中共有 13 类 147 个 SAS 函数 , 现 将其中最常用者的用法作一扼要介绍。 算术函数 (1)求一个数的绝对值的函数 ABS 和求一个正数的算术平根的函数
3、SQRT 如求 -250 的绝对值的语句为 x=ABS(-250)、求 625 的算术平根的语句为 y=SQRT(625)。 (2)求若干个数的最大值的函数 MAX 和最小值的函数 MIN DATA; a1=2; a2=-9; a3=15; a4=-23; x=MAX(of a1-a4); y=MIN(of a1-a4); FILE PRINT; PUT x y; RUN; 程序运行结果为 x=15、 y=-23。 截取函数 (1)取一个数的整数部分的函数 INT、按规定舍入精度取一个数的近似值的函数 ROUND; (2)取 自变量的最小整数的函数 CEIL、取 自变量的最大整数的函数 FLO
4、OR DATA; 运行结果 a=INT(223.456); b=ROUND(223.456, 100); a=223 b=200 c=ROUND(223.456,10); d=ROUND(223.456,1); c=220 d=223 e=ROUND(223.456,0.1); f=ROUND(223.456,0.01); e=223.5 f=223.46 g=CEIL(2.4); h=CEIL(-2.4); i=FLOOR(2.4); j=FLOOR(-2.4); g=3 h=-2 FILE PRINT; PUT a b c d e f g h i j; RUN; i=2 j=-3 数学函数
5、 (1)以为底的指数 EXP、 自然对数 LOG(以 e 为底 )、以 2 为底的对数 LOG2 和常用对数函数 LOG10(以 10 为底 ) DATA; a=2; b=2.718281828; c=10; w=EXP(a); x=LOG(b); y=LOG2(a); z=LOG10(c); FILE PRINT; PUT w x y z; RUN; 程序运行结果为 w7.389056、 x1、 y=1、 z=1。 (2)正弦 SIN、余弦 COS、正切 TAN 以及它们的反函数 ARSIN、 ARCOS、 ATAN u=SIN(a); v=COS(a); w=TAN(a); 这里 a 的单
6、位是弧度 , u,v w 是实数 ; x=ARSIN(b); y=ARCOS(b); z=ATAN(b); 这里 b 是实数 , x, y, z 是弧度。 概率函数 (1)泊松函数 POISSON 和二项概率函数 PROBBNML 求概率 P= j 0 e-(j/j!),函数的格式是 : POISSON(,n),当 =1、 n=2 时 , 程序为 : DATA; P=POISSON(1, 2); FILE PRINT; PUT P; RUN; 结果是 : P=0.9197。 求概率 P= j 0 CjnPj(1-P)n-j,函数的格式是 :PROBBNML(p,n,m),当 p=0.5、 n=
7、10、m=4 时 , 程序为 : DATA; P=PROBBNML(0.5,10,4); FILE PRINT; PUT P; RUN; 结果是 : P=0.37695。 (2)在标准正态、 学生 t、卡、 F 下 , 若给定横坐标上的分位点和 自由度的值 , 可求出随机变量小于等于该分位点值的概率 , 其语句的形式如下 : Pu=PROBNORM(u); Pt=PROBT(t, df); Px=PROBCHI(x, df); Pf=PROBF(f,ndf,ddf) 这里 , u、 t、 x、 f 分别代表服从标准正态、中心 t、中心卡、中心 F 的随机变量所取的分位点的值 , df 为自由度
8、 , ndf、 ddf 分别为 F 统计量中分子、分母的自由 度 (下同 ), Pu、 Pt、 Px、 Pf 为各随机变量取值小于给定分位数的概率。 分位数函数 在标准正态、 学生 t、卡 、 F 下 , 若给定左侧尾端的概率 P 和自由度 df 的值 , 可求出横坐标上的分位点的数值 , 其语句的形式 如下 : u=PROBIT(P); t=TINV(P, df); 2=CINV(P,df); F=FINV(P,ndf,ddf) 注意 :实际使用时,常需计算出与右侧尾单的概率相对应的分位数,故可令 P=1-alpha, 这里, alpha 就是事先规定的右侧尾端概率。 样本统计量函数 给定一
9、组定量数据 Xi, i=1, 2, , n, 欲求 15 种样本统计量之中某些统计量的值时 ,可 用相应的样本统计量函数计算 ;若同时想得到所有这些值 ,可直接用 UNIVARIATE过程计算。样本统 计量函数在语句中的形式如下 (以求样本均数的函数 MEAN 为例 ,其他用法相同 ): A1=MEAN(of X1-Xn);或 A2=MEAN(X1, X2, , Xn); 第 1 种形式适合事先给变量 X1Xn 赋 了值的场合 ; 第 2 种形式适合直接将具体数代入括号内 )。 7. 日期函数 由两富同日期计算出它们之间的天数 ,可用 INTCK 函数。如 : A=01JUN93D; B=01
10、JUN94; C=INTCK(DAY, A, B); 则 C=365(天 )。其他从略。 5.3 SAS 语句简 介 用在 DATA 步的文假作语句 DATA 语句 表示一个数据步的开始 , 并给出正被创建的 SAS 数据集的名字。 (1)格式 : DATA SASdataset(dsoptions); (2)说明 : SASdataset 是这个 DATA 步正被创建的一个或几个 SAS 数据集的名字 ;dsoptions 告诉 SAS 系统关于正被创建的 SAS 数据集的更多的信息。 (3)SAS 数据集的名字的种类 省略数据集名 DATA; 等价于写 : DATA _DATA_;每运行一
11、次 ,SAS 系统自动 给创建的数 据集依次命名为 DATA1, DATA2, 。 单水平名字 DATA ABC; SAS系统自动命名为 WORK.ABC,这里 WORK 是隐含的第一水平名 字 ,即库名 , 彻底退出 SAS 系统时 ,此数据集就消失了 , 故称为临时数据集。 ABC 是第二水平名 字 ,它可以由不超过 8 个字符组成。 双水平名字 DATA WWW.ABC; 这里 WWW是库标记 , 它靠 LIBNAME语句建立起与某个目录 之间的联系 ,如 : LIBNAME WWW C:HULP; DATA WWW.ABC;枕 明想在 C 盘的目录名为 HULP 下建立一个名为 ABC
12、.SSD 的永久数据集 ,“.SSD”是 SAS 系统自动加的 , 此文件只供 SAS系统调 用 ,用户无法直接阅读。调用方式为 :LIBNAME WWW C:HULP;PROC 过程名 DATA=WWW.ABC; 再写其他 SAS 语句。 特殊的数据集名 DATA _NULL_; 和 DATA _LAST_;前一个语句表明只想用 PUT 语句来输 出一些结果 , 但不想创建 SAS 数据集 ,可减少使用计算机的资源 ; 后一个语句表明 SAS系统使用 一个称为 _LAST_的特殊自动变量来保留在一个 SAS 程序里最新创建的 SAS 数据集。注意 : 在进 入 SAS DMS 后要建立的第一
13、个数据集名不能用 _LAST_。 同时使用多个数据集名 如果你想对一组含有年龄和另外 10 个变量的资料按青年、中 年、老年创建三个数据集 , 可用如下的方法实现 : DATA ONE TWO THREE; INPUT AGE X1-X10; IF AGE35 AND AGE55 THEN OUTPUT THREE; CARDS; (4)dsoptions(即 SAS 数据集的选择项 ) 注意 下面的 、 两个选择项仅当读已存在的 SAS 数据集时有效。 DROP=变量名列表 等号后面的所有变量将不出现在此数据集中 ; FIRSTOBS=n 从数据集中第 n 个观测值开始处理 ; IN=变量名
14、 在 SET, MERGE 或 UPDATA 语句里规定一个新变量的名字 ,其取值指示观测从 哪个数据集得到。如 : MERGE ONE(IN=A) TWO; 即当前观测取自 ONE 时 , 则 A=1,这一信息可用 于 DATA 步中间的程序语句 (如 : IF A=1 THEN ), 但此变量不进入正被创建的 SAS 数据集中 ; KEEP=变量名列表 等号后面的所有变量将保留在数据集中 ; LABEL=单引号内写标签内容 , 字符数应 40; OBS=n n 指被处理的已存在的数据集的最后一个观测的序号 ; TYPE=DATA(或 TYPE=CORR) 指定 SAS 数据集的类型 , D
15、ATA 指一般的数据集、CORR 指结构 为相关矩阵的数据集 , 常由 SAS 过程自动产生 ; INFILE 语句 (输入文件语句 ) 用来定义一个外部文件 , 它需用 INPUT 语句读取。外部文件可以是已存在磁盘上的 , 也可 以是从键盘上输入的数据行。 (1)格式 : INFILE filespecification options; (2)说明 : filespecification 用来定义文件 , options 给出选择项 ; (3)filespecification 有以下三种形式 : fileref(文件标志 ) filename(文件名 ) CARDS 指明输入的数据紧跟
16、着 CARDS 语句 , 如 : INFILE C:HULPABC.PRG options; 这里 C:HULP 是文件标志、 ABC.PRG 是文件名 ; 又如 : INFILE CARDS options; 这里 CARDS 相当于文件标志。 (4)下列选择项 (options)可以出现在 INFILE 语句中 : COLUMN=variable 或 COL=variable 定义一个变量 , 其值是指针所在的当前列位置。 END=variable 定义一个变量 , 作为文件结束的标志。 EOF=label 是一个语句标号 , 当 INFILE 语句读到文件末尾时 , 作为隐含的 GOTO
17、 语句的目标。 FIRSTOBS=linenumber 要求从指定的行开始读取数据 , 而不是从文件的第一个记录开始。 LENGHT=variable 定义一个变量 , 其值是当前输入数据行的长度。 OBS=n 指定从一个顺序输入文件中读取数据的最后一个观测 (即第 1第 n 个观测 )。 INPUT 语句 (输入语句 ) 描述一个输入记录中数值的安排情竣给相应的 SAS 变量赋输入值 ,该语句只能用于读入 存 放于外部文件中的数据或跟随在 CARDS 语句之后的数值。 (1)一般形式 : INPUT specification; (2)说明 : 在 INPUT 语句中有四种方式描述一个记录值
18、 , 即 列格式输入 (column) INPUT variable $ startcolumn-endcolumn .decimals; variable 变量名 ,$指明其前面的那个变量是字符型的 ,数值型的变量则不写 $, 若这个变 量在前面已被定义为字符袖量 , $也不需写 ; startcolumn 是包含 该变量值的输入记录的第 列的列号 , -endcolumn 是包含该变量值的输入记录的最后一列的列号。如果变量值只占一 列 , 则省去 -endcolumn。 .decimals 如果输入值不包含一个隔开整数部分与小数部分的小数 点 ,decimals 用来指明小数部分的位数。如
19、 : INPUT number 10-15.2; 读取 number 的数值时 , 小数部分是两位。若输入值分别是 2314, 2, 400, -140, SAS 以 .2 形式读取的值依次是23.14, 0.02,4.00,-1.40。又 如 : INPUT NAME $ 1-8 AGE 11-12; 这里 1-8 和 11-12 指列号。 自由格式 (free-format)或表格式输入 (list) INPUT variable $ variable 变量名 , NAME 的值可以形如 : J. JONES 或 J. M. MARY。自由输入格式 适用场合 :输入的值彼此之 间至少有一个
20、空格隔开、用小数点 (.)而不是空格表示缺失数据、 字符型数值的最大长度为 8 个字节 ,除非在 LENGTH、 ATTRIB 或 INFORMAT 语句中规定了字符袖 量的长度。 指定格式输入 (formatted) INPUT variable formatmodifier informat; variable 变量名 ,formatmodifier 修改输入格式读取数据的方式 ,有两个格式修饰符 : “:”和 “ 这里 $CHAR10.和 2.分别指定了字符袖量 NAME 和数值袖量 AGE 的输入格式 ; 当输入的值都是以同一方式排列时 ,就可以用组格式表来表示格式。该格式 表是被循环
21、使用的 , 直到所有变量都被赋值 ;带有序号的变量值可用简单的形式列出来 , 如 : INPUT X1-X5 (4.1); 这表明 5 个变量的值都按整数部分占两位 ,小数部分占一位的格式输入 , 加上小数点共 4 位。两个格式修饰符的含意 : “:”把输入格式与自由格式输入的扫描特征结 合起来 ,表明变量的值是从以下非空格列中读取的 , 直到第 1 次遇到以下三种情况 : 下一个空 格列、先前定义的变量长度已读满、数据行结束 ;“ “=”指明使用的是命名格式输入方式。如 : INPUT NAME = $ AGE =; (3)高级 INPUT 语句 用指针来 跟踪读取数据的位置。 列指针控制
22、: 绝对和相对列指针控制符分别为 “”和 “+”,其作用是把指针移到指 定的列 ,“5”与 “+5”的区别是 : “5”是把指针直接移到每行的第 5 列、而 “+5”是把指 针从当前的位置向后移动 5 列。有 9 种列指针控制 : n 把指针移到第 n 列。如 :INPUT 15 AGE 2.;把指针移到第 15 列 , 从数据行的第15-16 列读数据值赋给变量 AGE。 pointvariable 把指针移到指针变量所指的列。如 : A=15; INPUT A AGE 2.; (expression) 把指针移到表达式值所指的列。如 : A=5; INPUT (A*3) AGE 2.; c
23、haracterstring 把指针移到数据行中字符串 charaterstring 之后的第一个非空格 列。 charactervariable 首先确定字符变量所取值 (即字符串 )在输入行的位置 ,然后把指针 移到这个字符串之后的第一个非空格列。 (characterexpression) 先确定字符表达式值的位置 ,然后移指针到其后第一个非空格 列。 +n 把指针向右移动 n 列。如 : INPUT 20 AGE 2. +4 WEIGHT; +pointvariable 把指针移到指针变量值所指的列。如 : A=-2; INPUT X 1-15 +A Y 2.; 此语句表明从数据行的
24、1-15 列取值赋给变量 X, 然后指针左移 2 列从第 13 列开始取值赋给变量 Y。 +(expression) 把指针移到表达式所指的列。如 : INPUT X 1-15 +(-2) Y 2.; 行指针控制 : 其控制符有 “#”和 “/”, 其作用是把指针移到指定的行 。有 4 种行指 针控制 : #n 把指针移到第 n 行。 #pointvariable 把指针移到指针变量值所指的行。 #(expression) 把指针移到表达式值所指的行。 / 把指针移到下一行的第一列。如 : INPUT NAME $ SEX $ / AGE WEIGHT; 行固定标识符 : 和 两种 , 写在
25、INPUT 语句的结尾 , 其区别在于 : 一个数据行用多个 INPUT 语句读取数据 , 用一个 结尾 ;一个输入行数据含有多个观测值 , 用两个 结尾。 FILE 语句 (文 件语句 ) 定义当前的输出文件 , 并且是一个外部文件 ,一般要与 PUT 语句配合使用。其选择项可用 来控制文件输出的形式 , 还可定义变量来跟踪指针所在的当前行和列的位置、定义在每一个 新的输出页中开始打印的抬头。在同一个 DATA 步中可用多个 FILE 语句 ,它是可执行语句 ,故可 用于条件 (IF-THEN)语句中 , 也可用到其他一些语句。 (1)格式 : FILE filespecification
26、options; (2)说明 : filespecification 用来定义外部文件 , options 给出选择项 ; (3)filespecification 可有如下形式 : fileref 给出文件标志 , 也是 PUT 语句输出的对象 , FILENAME 语句把一个外部文件同 fileref 联系起来 ; filename定义外部文件的全名字 , 文件名要写在单引号内 ; LOG 如果在 PUT 语句之前不使用 FILE 语句或使用该语句 , 但形式为 FILE LOG options; 其输出内容都将送到 LOG 窗口内 ; PRINT 把 PUT 语句产生的数据行输出到标准
27、SAS 打印文件中去 (若用 “FILE PRINT options;”形式 , 则将内容直接送到 OUTPUT 窗口中去 )。 (4)用来控制当前输出文件形式的选择项很多 ,从略。 PUT 语句 把内容输出到 SAS 系统的 LOG 窗口、 SAS 过程中的输出文件或任何在 FILE 语句中定义过的 文件中去。由最近的 FILE 语句指明的文件叫当前输出文件。若在当前的 DATA 步执行中 ,PUT 语 句前没有 FILE 语句 ,则 PUT 语句把内容输出到 LOG 窗口。 PUT 语句可以输出变量值或字符串。输 出变量值有以下三种方式 :列输出格式、 自由格式和指定格式。 (1)格式 :
28、 PUT specification; (2)说明 : specification 指的是变量的值或字符串内容是以何种形式输出的。 (3)specification 的具体内容有 : variable 列出要输出的变量名 ; characterstring指明在 PUT 语句中要输出的字符串 ,字符串一定要写在单引号内 ; pointcontrol 把指针移到规定的行和列上 ; _INFILE_输出当前输入文件或 CARDS 后面的数据行中的最后一行 ; _ALL_输出所有变量的值 ,包括 _ERROR_,_N_,以及在 DATA 步中用命名式输出定义的变量。 PUT 语句可以没有 speci
29、fication,如 : PUT;它把当前输出行的内容输出到当前文件中去 ,即使 当前行是空的 , 也是如此。 (4)列格式输出 PUT variable= $ startcolumn-endcolumn .decimalplaces; “=”在输出变量值的同时写上变量的名字及其符号 , 其他项的含义见 INPUT 语句中相应 部分。 (5)自由格式输出 PUT variable= $; variable 输出变量名 ,=指定变量值用命名的方式输出 ,$字符袖量的标志。 (6)指定格式输出 PUT variable= format.; =指定变量值用命名的方式输出 ,其它项的含意见 INPUT
30、 语句中指定格式输入的相应部分。 (7)指针控制与格式修饰符 关于指针控制参看 INPUT 语句中相应部分 , 这里对不同之处 作些介绍。 _PAGE_把指针移到新的一页的第一行 PUT _PAGE_; OVERPRINT把当 前输出内容输出到前一个输出行中 例如要在标题 “TITLE OF PAGE” 下面加一横线 , 其语句是 : PUT TITLE OF PAGE overprint _; 格式修饰符 “n*”指明其后的格式将被重复使用 n 次。如 : PUT X1-X5 (5*7.2); 格式修饰符 “:”,它后面跟一个格式 , 指明用此格式输出变量值 , 但要去掉前面或后 面的空格
31、, 不同数值之间只留一个空格 ; 输出数组元素 : PUT array*; 数组不能是临时数组 ,*处不能 是数组指示变量 , 但可 以是在 PUT 语句执行时可估值的任何 SAS 表达式 ,也可直接用 *号。 SET 语句 从一个或几个 SAS 数据集中读取观测值。此语句的适用场合 : 完全复制现存的数据集 ; 把一个数据集分成几个子数据集 ; 把几个现存的数据集合并成一个新数据集。 (1)格式 : SET SASdataset(dsoptions IN=name)setoptions; (2)说明 : SASdataset 指定一个或几个现存的 SAS 数据集。在一个 SET 语句中最多可
32、以指 定 50 个数据集 ;dsoptions 是数据集的选择项 ; name 是产生一个新变量 ,在 DATA 步中 ,如果这个 数据集对当前的观测有贡献 ,其值为 1,反之为 0;setoptions 定义 SET 语句的选择项。 (3)数据集的选择项 (dsoptions) 参见 DATA 语句中相应部分。 (4)SET 语句的选择项 (setoptions) NOBS=name 产生一个变量 ,其值是输入数据集的观测总数。如果多于一个数据集列在 SET 语句之后 ,NOBS 的值就是所有这些数据集中观测总数。该变量不含在新产生的数据 集中。 END=name 产生一个变量 ,作为文件结
33、束的标志。该变量的初值为 0,当 SET 语句读完输入 数据集的最后一个观测或合并后的数据集的最后一个观测时 ,其值为 1。 (5)复制新的数据集 把数据集 A 复制成数据集 B 的方法 : DATA B; SET A; (6)由数据集 A 生成含有部分变量的子集 B,可用下面 3 种方法之一来实现 : 在 SET语句中使用 DROP=或 KEEP=的数据集选择项 ,如 : DATA B; SET A(KEEP=X Y); 在 DATA 步中使用 DROP 与 KEEP 语句 ,如 : DATA B; SET A; KEEP X Y; 在 DATA 语句中使用 DROP=或 KEEP=选择项
34、,如 : DATA B(KEEP X Y) C(KEEP Y); SET A; (7)由数据集 A 生成含有部分观测的子集 B,一般要借助子集 IF 语句来实现 ,如 :DATA B; SET A; IF SEX=M;最后一句还可写成 :IF SEX=M THEN OUTPUT;或 IF SEX=M THEN DELETE; 其目的都是选择 SEX 的值为 M 的观测作为新生成数据集的观测。 (8)由数 据集 A 生成含有新产生的变量的数据集 B,如 :DATA B; SET A; TOTAL=SUM(OF X1-X5); (9)数据集的连接 把若干个数据集按先后次序一个一个的连接起来 ,形成
35、一个大数据集。 相同变量的数据集的连接 ,如 :DATA C; SET A B; 不同变量的数据集的连接 ,如果 SET 语句后列出的数据集中含有的变量不全相同 , 则从 一个数据集中来的观测对于那些只有在其它数据集中定义的变量 ,其值为缺失值。 (10)按已排好的顺序合并数据集 要先用 SORT过程排序 ,再借助 BY和 SET语句来实现 ,如 : PROC SORT DATA=A; BY X; PROC SORT DATA=B; BY X; DATA C; SET A B; BY X; MERGE 语句 (合并语句 ) 把两个及以上数据集中的观测合并成一个观测作为新生成的数据集的观测 (即
36、一一对应地 左右连接 ),合并观测时的方式依赖于是否有 BY 语句伴随着 MERGE 语句。 (1)格式 : MERGE SASdataset(dsoptions IN=name) SASddataset(dsoptions IN=name)END=name; (2)说明 : END=name 产生一个变量标志着文件的结束 ,其初值为 0,当 MERGE 语句执行到最 后一个观测时 ,其值为 1,该变量不包括在正被创建的数据集中。其他项的含义参见 SET语句。 (3)一对一合并 (没有 BY 语句 ) 当没有 BY 语句伴随 MERGE 语句时 , MERGE 语句使全部数据集中的第 i 个
37、(i=1,2,)观测依次 合并成一行 , 成为一个新的观测。新生成的数据集中观测总数为全部数据集中观测个数的最 大值。如果某数据集的观测较少 ,合并后 ,短 缺的那些观测将以缺失值的形式出现 ; 如果某一 个变量同时出现在几个数据集中 ,合并后 ,只有一个变量 ,其值是列在 MERGE 语句中含该变量的 最后那个数据集所对应的数。 (4)匹配合并 (带有 BY 语句 ) 如果想把两个或两个以上数据集按照一些变量值合并 ,则需借助 BY 语句来实现 ,一个MERGE 语句只能有一个 BY 语句相伴随 , 并且 ,各数据集中至少有一个变量 (称为 BY 变量 )是相同的 ,每 个数据集必须先按这些
38、变量排序。 UPDATE 语句 (更新语句 ) 该语句有一个特殊功能 , 即用数据集乙 (称为修改数据集 ) 去修改数据集甲 (称为主数据 集 )。该语句一定要用 BY 语句伴随 ,BY 语句给出合并观测时的共同变量的名字 ; 主数据集中不 能含有多于一个的共同变量值相同的观测。产生的新数据集包含主数据集中的所有观测 , 如 果修改数据集含有主数据集中没有的观测 ,则这些观测出现在新的数据集中。 (1)格式 : UPDATE masterdataset dsoptions (IN=variable1) transactiondataset (dsoptions IN=variable2) EN
39、D=variable; (2)说明 : master.和 transaction.分别为主数据集名和用以修改的数据集名 ,其他 项参见 SET 和 MERGE 语句。 BY 语句 在 DATA 步中用以控制 MERGE、 SET 或 UPDATE 语句的运行并建立特殊的组合变量。 (1)格式 : BY DESCENDING GROUPFORMAT variable NOTSORTED; (2)说明 : DESCENDING 指明数据集是按下降的次序对其后的变量值进行排序、GROUPFOR- MAT 是当 SAS 给自动变量 FIRST.和 LAST.赋值时 , 指明该语句中的变量是按其格式化值
40、使用的 , 若缺省 , 则用非格式化值、 variable 定义数据集用以排序的每个变量名、 NOTSORTED指明具 有同 BY值的观测组合在一起 , 但 BY值不必按字母或数字顺序排列 , 此选择项可出现在BY 语句 中任何地方。 10 CARDS 与 CARDS4 语句 该语句标志着后面紧跟着数据行。通常用前者 , 格式为 : CARDS;并用一个分号 (独占一 行 )作为数据行结束的标志 ; 当数据行中含 有分号作为输入数据时 ,用后者 ,格式为 : CARDS4; 并用个连续的分号 “;”(独占一行 )作为数据行结束的标志。 用在 DATA 步的运行语句 赋值语句 如 X=3; 或
41、Y=a+b; 注意 此处 a、 b 是事先已赋过值的变量或是具体的数值。 累加语句 如 N+1; 开始 N 被置为 0,以后 DATA 步每执行一次, N 的值就增加。 DELETE 语句 如 DATA abc; INPUT x ; IF x100 THEN DELETE; CARDS; (数据行 ); RUN; 所建立的 SAS 数据集 abc 中就不会包含大于 100 的数值。 LOSTCARD 语句 当每个观测写成几个数据行时,若当前观测丢失其中的一行或几行, LOSTCARD 语句可以 防止 SAS 系统从下一个观测的数据行读数据作为当前观测的一部分。如 DATA abc; 103 C
42、 INPUT id1 x$ #2 id2 y #3 id3 z$; 103 C IF id1 NE id2 OR id2 NE id3 THEN LOSTCARD; 104 D CARDS; 105 E 101 A 105 E 102 B 105 E 102 B ; 103 C RUN; 说明 此例中, DATA 步每三个数据行作为一个观测。第、两个观测都丢失了两个记 录;第个观测丢失了一个记录;第、两个 观测是完整的。 新建立的数据集 abc中只有 两个完整的观测,不完整的观测不会进入新建的数据集。 STOP 语句与 ABORT 语句 按规定条件停止处理当前执行的 DATA步,并继续执行其后
43、的 DATA语句或 PROC语句。两者 的区别在于 STOP 语句属于正常停止执行当前 DATA 步,不输出出错信息; 而 ABORT语句属于 异常中止执行当前 DATA 步,输出出错信息。使用的方法是 IF (条件 ) THEN STOP; IF (条件 ) THEN ABORT; WHERE 语句 该语句允许用户在 SAS 系统把观测读入 DATA 步之前从已存在的 SAS 数据集中选择符合特殊 条件的观测,常放在 SET(设置 )、 MERGE(合并 )、 UPDATE(更新 )语句之后使用。如 DATA one; SET aaa; WHERE x5 THEN DO; y=x*10; P
44、UT x= y=; END; z=x+3; 这些语句表明 DO 与 END 之间的两句仅当 x5 时被执行,否则,跳到赋值语句 z=x+3去执行。 (2)循环 DO 语句 格式为 DO 下标变量 =初值 TO 终值 BY 增量 WHILE UNTIL(表 达式 );如 DO i=1 TO 10; DO i=1 TO 10 WHILE(xy); DO i=0.1 TO 0.9 BY 0.1, 1 TO 10 BY 1, 20TO 100 BY 10; (3)DO OVER 语句 格式为 DO OVER 数组名 ; 该语句对隐含下标数组元素执行 DO 组里的语句。如 DATA test; DO O
45、VER s; CARDS; INPUT sc1-sc5; s=s*100; 0.95 0.88 0.57 0.90 0.65 ARRAY s sc1-sc5; END; ; (程序的第部分 ) (程序的第部分 ) (程序的第部分 ) 这里的 “DO OVER s;”等价于 “DO _i_=1 TO 5;”。 (4)DO WHILE 语句 格式为 DO WHILE(表达式 ); 如 n=0; DO WHILE(n LT 5); PUT n=; END; 只要 n=5); PUT n=; n+1; END; 这些语句重复被执行直到 n5时停止。 END 语句 END 语句是组成 DO 组或 SEL
46、ECT 组的 SAS 语句中的最后一个语句。格式为 END; SELECT 语句 (选择语句 ) 格式为 SELECT 表达式 ; WHEN (表达式 ) 语句 ; OTHERWISE 语句 ; END; 该语句开始一个 SELECT 组,在组内, 当一个特殊条件成立时, 从 WHEN 语句选择一个 SAS 语句 来执行,至少必须出现一个 WHEN 语句。 如果 WHEN 条蓟成立,选择 OTHERWISE语句执行一个 规定的语句。 END 语句结束 SELECT 组。如 DATA new; SELECT(a); OTHERWISE x=1; SET old; WHEN(1) x=x*10;
47、END; x=UNIFORM(0); WHEN(2); RUN; WHEN(3) x=x*100; (程序的第部分 ) (程序的第部分 ) (程序的第部分 ) 这是假定原有数据集 old 中的变量 a 的取值为 1,2,3 或缺失。 当 a 依次取这些值时,变量 x 按要求分别作了如下变换 x*10、不变、 x*100、 x=1。 IF 语句 (1)条件 IF 语句 IF THEN 语句 格式为 IF 表达式 THEN 语句 ; 如 IF x=3 THEN y=x; IF THEN ELSE 语句 格式为 IF 表达式 THEN 语句 ; ELSE 语句 ; 如 IF year=1984 THEN COLOR=BLUE; ELSE COLOR=RED; (2)子集 IF 语句 格式为 IF 表达式 ; 如 IF sex=F; 产生的子数据集仅包含 sex 值为 F的那些观测。 GO TO 语句 (无条件转移语句 ) 格式为 GO TO 语句标号 ; 该语句常出现在 IF THEN 语句中作为 THEN 的分句。如 DATA a; x=3; CARDS; INPUT x y;