资源描述
SAS表达式简介
1.SAS常数表达式
(1)数值常数 如: 1.23、 -5、 0.5E-10。
(2)字符常数 如: name1='TOME'、 name2='MARY'、name3='JOHN'。
(3)日期(d)、时间(t)、日时(dt)常数 如: d1='01JAN80'd、t1='9:25:19't、
dt1='18JAN80:9:27:05'dt。
(4)16进制常数(略)
2.SAS运算符
(1)前缀算符与后缀算符
前缀算符, 即正号或负号; 如: +Y; -25; -COS(30); +(X*Y); 后缀算符,即两个运算对
象之间的运算符号, 如: 1+9; 4-2; 6<8。
(2)只含一个运算符的简单表达式(Ⅰ组)和含有多于一个运算符的复合表达式(Ⅱ组)
Ⅰ组, 如: A+B; C-D; E*F; G/H; Ⅱ组, 如: 1-EXP(N/(N-1)); 100-LOG(N*(N+1));
(3)操作运算的顺序
求一个复合表达式的值时, 其操作运算的顺序和优先级遵从如下的规则(见表5.1):
表5.1 SAS的运算符及其在运算顺序上的优先级
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
优先级组别 运 算 符 号 等价表示 运算符号含义之说明
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
第 0 组 ( ) 括号
第 1 组 ** + - 乘方, 正数, 负数
^ >< <> NOT MIN MAX 逻辑非, 最小, 最大
第 2 组 * / 乘, 除
第 3 组 + - 加, 减
第 4 组 ‖或|| 字串连接
第 5 组 < <= LT LE 小于, 小于等于
= ^= EQ NE 等于, 不等于
>= > GE GT 大于等于, 大于
IN 等于一列元数中的某一个
第 6 组 & AND 逻辑与
第 7 组 |或| OR 逻辑或
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
各组的计算顺序分别为: 第0组由内向外;其他各组均自左至右。第4组和第7组都给出了
两种运算符号, 这是因为不同的系统可能只认识其中的某一种
5.2 SAS函数简介
SAS软件中共有13类147个SAS函数, 现将其中最常用者的用法作一扼要介绍。
1.算术函数
(1)求一个数的绝对值的函数ABS和求一个正数的算术平根的函数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。
2.截取函数
(1)取一个数的整数部分的函数INT、按规定舍入精度取一个数的近似值的函数ROUND;
(2)取≥自变量的最小整数的函数CEIL、取≤自变量的最大整数的函数FLOOR
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
3.数学函数
(1)以e为底的指数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;
程序运行结果为∶w≈7.389056、x≈1、y=1、z=1。
(2)正弦SIN、余弦COS、正切TAN以及它们的反函数ARSIN、ARCOS、ATAN
u=SIN(a); v=COS(a); w=TAN(a); 这里a的单位是弧度, u,v w是实数;
x=ARSIN(b); y=ARCOS(b); z=ATAN(b); 这里b是实数, x, y, z是弧度。
4.概率函数
(1)泊松函数POISSON和二项概率函数PROBBNML
求概率P=∑nj=0 e-λ(λj/j!),函数的格式是: POISSON(λ,n),当λ=1、n=2时, 程序为:
DATA; P=POISSON(1, 2); FILE PRINT; PUT P; RUN; 结果是: P=0.9197。
求概率P=∑mj=0 CjnPj(1-P)n-j,函数的格式是:PROBBNML(p,n,m),当p=0.5、n=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为自由度, ndf、ddf分别为F统计量中分子、分母的自由
度(下同),Pu、Pt、Px、Pf为各随机变量取值小于给定分位数的概率。
5.分位数函数
在标准正态、'学生't、卡 、F下, 若给定左侧尾端的概率P和自由度df
的值, 可求出横坐标上的分位点的数值, 其语句的形式如下:
①u=PROBIT(P); ②t=TINV(P, df); ③χ2=CINV(P,df); ④F=FINV(P,ndf,ddf)
注意:实际使用时,常需计算出与右侧尾单的概率相对应的分位数,故可令P=1-alpha,
这里,alpha就是事先规定的右侧尾端概率。
6.样本统计量函数
给定一组定量数据Xi, i=1, 2, …, n, 欲求15种样本统计量之中某些统计量的值时,可
用相应的样本统计量函数计算;若同时想得到所有这些值,可直接用UNIVARIATE过程计算。样本统
计量函数在语句中的形式如下(以求样本均数的函数MEAN为例,其他用法相同):
A1=MEAN(of X1-Xn);或A2=MEAN(X1, X2, …, Xn); 第1种形式适合事先给变量X1~Xn赋
了值的场合; 第2种形式适合直接将具体数代入括号内)。
7. 日期函数
由两富同日期计算出它们之间的天数,可用INTCK函数。如:
A='01JUN93'D; B='01JUN94'; C=INTCK('DAY', A, B); 则C=365(天)。其他从略。
5.3 SAS语句简介
Ⅰ.用在DATA步的文假作语句
1.DATA语句 表示一个数据步的开始, 并给出正被创建的SAS数据集的名字。
(1)格式: DATA [SASdataset[(dsoptions)]]…;
(2)说明: SASdataset是这个DATA步正被创建的一个或几个SAS数据集的名字;dsoptions
告诉SAS系统关于正被创建的SAS数据集的更多的信息。
(3)SAS数据集的名字的种类
①省略数据集名 DATA; 等价于写: DATA _DATA_;每运行一次,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.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后要建立的第一个数据集名不能用_LAST_。
⑤同时使用多个数据集名 如果你想对一组含有年龄和另外10个变量的资料按青年、中
年、老年创建三个数据集, 可用如下的方法实现:
DATA ONE TWO THREE; INPUT AGE X1-X10; IF AGE<=35 THEN OUTPUT ONE;
ELSE IF AGE>35 AND AGE<=55 THEN OUTPUT TWO;
ELSE IF AGE>55 THEN OUTPUT THREE; CARDS;
(4)dsoptions(即SAS数据集的选择项)
注意∶下面的②、⑥两个选择项仅当读已存在的SAS数据集时有效。
①DROP=变量名列表 等号后面的所有变量将不出现在此数据集中;
②FIRSTOBS=n 从数据集中第n个观测值开始处理;
③IN=变量名 在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数据集的类型, DATA指一般的数据集、CORR指结构
为相关矩阵的数据集, 常由SAS过程自动产生;
2.INFILE语句(输入文件语句)
用来定义一个外部文件, 它需用INPUT语句读取。外部文件可以是已存在磁盘上的, 也可
以是从键盘上输入的数据行。
(1)格式: INFILE filespecification options;
(2)说明: filespecification用来定义文件, options给出选择项;
(3)filespecification有以下三种形式:
①fileref(文件标志) ②'filename'(文件名) ③CARDS指明输入的数据紧跟着CARDS语句,
如: INFILE 'C:\HULP\ABC.PRG' options; 这里C:\HULP是文件标志、ABC.PRG是文件名;
又如: INFILE CARDS options; 这里CARDS相当于文件标志。
(4)下列选择项(options)可以出现在INFILE语句中:
①COLUMN=variable或COL=variable定义一个变量, 其值是指针所在的当前列位置。
②END=variable定义一个变量, 作为文件结束的标志。
③EOF=label是一个语句标号, 当INFILE语句读到文件末尾时, 作为隐含的GOTO语句的目标。
④FIRSTOBS=linenumber要求从指定的行开始读取数据, 而不是从文件的第一个记录开始。
⑤LENGHT=variable定义一个变量, 其值是当前输入数据行的长度。
⑥OBS=n指定从一个顺序输入文件中读取数据的最后一个观测(即第1~第n个观测)。
3.INPUT语句(输入语句)
描述一个输入记录中数值的安排情竣给相应的SAS变量赋输入值,该语句只能用于读入
存放于外部文件中的数据或跟随在CARDS语句之后的数值。
(1)一般形式: INPUT [specification]…;
(2)说明: 在INPUT语句中有四种方式描述一个记录值, 即
①列格式输入(column) INPUT variable [$] startcolumn[-endcolumn] [.decimals];
variable变量名,$指明其前面的那个变量是字符型的,数值型的变量则不写$, 若这个变
量在前面已被定义为字符袖量, $也不需写; startcolumn是包含该变量值的输入记录的第
1列的列号, -endcolumn是包含该变量值的输入记录的最后一列的列号。如果变量值只占一
列, 则省去-endcolumn。 .decimals如果输入值不包含一个隔开整数部分与小数部分的小数
点,decimals用来指明小数部分的位数。如: 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变量名,&指明字符袖量值中可能在一处或多处含有单一的空格, 此时不同变
量值之间需用两个或两个以上的空格隔开。如:
INPUT NAME $ & AGE X1-X4; NAME的值可以形如: J. JONES或J. M. MARY。自由输入格式
适用场合:输入的值彼此之间至少有一个空格隔开、用小数点(.)而不是空格表示缺失数据、
字符型数值的最大长度为8个字节,除非在LENGTH、ATTRIB或INFORMAT语句中规定了字符袖
量的长度。
③指定格式输入(formatted) INPUT variable [formatmodifier] informat;
variable变量名,formatmodifier修改输入格式读取数据的方式,有两个格式修饰符:
“:”和“&”,informat给出读取数据时的输入格式,它总是包括一个(·)或以(·)结尾,如:
INPUT NAME $CHAR10. AGE 2.; 这里$CHAR10.和2.分别指定了字符袖量NAME和数值袖量
AGE的输入格式; 当输入的值都是以同一方式排列时,就可以用组格式表来表示格式。该格式
表是被循环使用的, 直到所有变量都被赋值;带有序号的变量值可用简单的形式列出来, 如:
INPUT X1-X5 (4.1); 这表明5个变量的值都按整数部分占两位,小数部分占一位的格式输入,
加上小数点共4位。两个格式修饰符的含意: “:”把输入格式与自由格式输入的扫描特征结
合起来,表明变量的值是从以下非空格列中读取的, 直到第1次遇到以下三种情况: 下一个空
格列、先前定义的变量长度已读满、数据行结束;“&”表明一个字符型输入值可能含有一个
或多个嵌在当中的单个空格,此时,不同的数据之间应该用两个以上的空格隔开。
④命名格式输入(named) INPUT {pointercontrol}variable={$}{informat};
“=”指明使用的是命名格式输入方式。如: INPUT NAME = $ AGE =;
(3)高级INPUT语句 用指针来跟踪读取数据的位置。
①列指针控制: 绝对和相对列指针控制符分别为“@”和“+”,其作用是把指针移到指
定的列,“@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.;
@'characterstring' 把指针移到数据行中字符串charaterstring之后的第一个非空格
列。
@charactervariable 首先确定字符变量所取值(即字符串)在输入行的位置,然后把指针
移到这个字符串之后的第一个非空格列。
@(characterexpression) 先确定字符表达式值的位置,然后移指针到其后第一个非空格
列。
@+n 把指针向右移动n列。如: INPUT @20 AGE 2. +4 WEIGHT;
@+pointvariable 把指针移到指针变量值所指的列。如: A=-2; INPUT X 1-15 +A Y 2.;
此语句表明从数据行的1-15列取值赋给变量X, 然后指针左移2列从第13列开始取值赋给变量Y。
@+(expression) 把指针移到表达式所指的列。如: INPUT X 1-15 +(-2) Y 2.;
②行指针控制: 其控制符有“#”和“/”, 其作用是把指针移到指定的行。有4种行指
针控制:
#n 把指针移到第n行。
#pointvariable 把指针移到指针变量值所指的行。
#(expression) 把指针移到表达式值所指的行。
/ 把指针移到下一行的第一列。如: INPUT NAME $ SEX $ / AGE WEIGHT;
③行固定标识符: @和@@两种, 写在INPUT语句的结尾, 其区别在于:
一个数据行用多个INPUT语句读取数据, 用一个@结尾;一个输入行数据含有多个观测值,
用两个@@结尾。
4.FILE语句(文件语句)
定义当前的输出文件, 并且是一个外部文件,一般要与PUT语句配合使用。其选择项可用
来控制文件输出的形式, 还可定义变量来跟踪指针所在的当前行和列的位置、定义在每一个
新的输出页中开始打印的抬头。在同一个DATA步中可用多个FILE语句,它是可执行语句,故可
用于条件(IF-THEN)语句中, 也可用到其他一些语句。
(1)格式: FILE filespecification [options];
(2)说明: filespecification用来定义外部文件, options给出选择项;
(3)filespecification可有如下形式:
①fileref给出文件标志, 也是PUT语句输出的对象, FILENAME语句把一个外部文件同
fileref联系起来;
②'filename'定义外部文件的全名字, 文件名要写在单引号内;
③LOG如果在PUT语句之前不使用FILE语句或使用该语句, 但形式为FILE LOG options;
其输出内容都将送到LOG窗口内;
④PRINT把PUT语句产生的数据行输出到标准SAS打印文件中去(若用 “FILE PRINT
options;”形式, 则将内容直接送到OUTPUT窗口中去)。
(4)用来控制当前输出文件形式的选择项很多,从略。
5.PUT语句
把内容输出到SAS系统的LOG窗口、 SAS过程中的输出文件或任何在FILE语句中定义过的
文件中去。由最近的FILE语句指明的文件叫当前输出文件。若在当前的DATA步执行中,PUT语
句前没有FILE语句,则PUT语句把内容输出到LOG窗口。PUT语句可以输出变量值或字符串。输
出变量值有以下三种方式:列输出格式、自由格式和指定格式。
(1)格式: PUT [specification]…;
(2)说明: specification指的是变量的值或字符串内容是以何种形式输出的。
(3)specification的具体内容有:
①variable列出要输出的变量名;
②'characterstring'指明在PUT语句中要输出的字符串,字符串一定要写在单引号内;
③pointcontrol把指针移到规定的行和列上;
④_INFILE_输出当前输入文件或CARDS后面的数据行中的最后一行;
⑤_ALL_输出所有变量的值,包括_ERROR_,_N_,以及在DATA步中用命名式输出定义的变量。
PUT语句可以没有specification,如: PUT;它把当前输出行的内容输出到当前文件中去,即使
当前行是空的, 也是如此。
(4)列格式输出 PUT [variable][=] [$] startcolumn[-endcolumn] [.decimalplaces];
“=”在输出变量值的同时写上变量的名字及其符号, 其他项的含义见INPUT语句中相应
部分。
(5)自由格式输出 PUT variable[=] [$];
variable输出变量名,=指定变量值用命名的方式输出,$字符袖量的标志。
(6)指定格式输出 PUT variable[=] format.;
=指定变量值用命名的方式输出,其它项的含意见INPUT语句中指定格式输入的相应部分。
(7)指针控制与格式修饰符 关于指针控制参看INPUT语句中相应部分, 这里对不同之处
作些介绍。
①_PAGE_把指针移到新的一页的第一行 PUT _PAGE_;
②OVERPRINT把当前输出内容输出到前一个输出行中 例如要在标题“TITLE OF PAGE”
下面加一横线, 其语句是: PUT 'TITLE OF PAGE' overprint '_____________';
③格式修饰符“n*”指明其后的格式将被重复使用n次。如: PUT X1-X5 (5*7.2);
④格式修饰符“:”,它后面跟一个格式, 指明用此格式输出变量值, 但要去掉前面或后
面的空格, 不同数值之间只留一个空格;
⑤输出数组元素: PUT array{*}; 数组不能是临时数组,*处不能是数组指示变量, 但可
以是在PUT语句执行时可估值的任何SAS表达式,也可直接用*号。
6.SET语句
从一个或几个SAS数据集中读取观测值。此语句的适用场合:
①完全复制现存的数据集;
②把一个数据集分成几个子数据集;③把几个现存的数据集合并成一个新数据集。
(1)格式: SET [[SASdataset(dsoptions IN=name)…][setoptions]];
(2)说明: SASdataset指定一个或几个现存的SAS数据集。在一个SET语句中最多可以指
定50个数据集;dsoptions是数据集的选择项; name是产生一个新变量,在DATA步中,如果这个
数据集对当前的观测有贡献,其值为1,反之为0;setoptions定义SET语句的选择项。
(3)数据集的选择项(dsoptions) 参见DATA语句中相应部分。
(4)SET语句的选择项(setoptions)
①NOBS=name产生一个变量,其值是输入数据集的观测总数。如果多于一个数据集列在SET
语句之后,NOBS的值就是所有这些数据集中观测总数。该变量不含在新产生的数据集中。
②END=name产生一个变量,作为文件结束的标志。该变量的初值为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=选择项,如: 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)数据集的连接 把若干个数据集按先后次序一个一个的连接起来,形成一个大数据集。
①相同变量的数据集的连接,如: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;
7.MERGE语句(合并语句)
把两个及以上数据集中的观测合并成一个观测作为新生成的数据集的观测(即一一对应地
左右连接),合并观测时的方式依赖于是否有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个(i=1,2,…)观测依次
合并成一行, 成为一个新的观测。新生成的数据集中观测总数为全部数据集中观测个数的最
大值。如果某数据集的观测较少,合并后,短缺的那些观测将以缺失值的形式出现; 如果某一
个变量同时出现在几个数据集中,合并后,只有一个变量,其值是列在MERGE语句中含该变量的
最后那个数据集所对应的数。
(4)匹配合并(带有BY语句)
如果想把两个或两个以上数据集按照一些变量值合并,则需借助BY语句来实现,一个MERGE
语句只能有一个BY语句相伴随, 并且,各数据集中至少有一个变量(称为BY变量)是相同的,每
个数据集必须先按这些变量排序。
8.UPDATE语句(更新语句)
该语句有一个特殊功能, 即用数据集乙(称为修改数据集) 去修改数据集甲(称为主数据
集)。该语句一定要用BY语句伴随,BY语句给出合并观测时的共同变量的名字; 主数据集中不
能含有多于一个的共同变量值相同的观测。产生的新数据集包含主数据集中的所有观测, 如
果修改数据集含有主数据集中没有的观测,则这些观测出现在新的数据集中。
(1)格式: UPDATE masterdataset dsoptions [(IN=variable1)
transactiondataset [(dsoptions IN=variable2)] [END=variable];
(2)说明: master...和transaction...分别为主数据集名和用以修改的数据集名,其他
项参见SET和MERGE语句。
9.BY语句
在DATA步中用以控制MERGE、SET或UPDATE语句的运行并建立特殊的组合变量。
(1)格式: BY [DESCENDING] [GROUPFORMAT] variable … [NOTSORTED];
(2)说明: DESCENDING指明数据集是按下降的次序对其后的变量值进行排序、GROUPFOR-
MAT是当SAS给自动变量FIRST.和LAST.赋值时, 指明该语句中的变量是按其格式化值使用的,
若缺省, 则用非格式化值、variable定义数据集用以排序的每个变量名、 NOTSORTED指明具
有同BY值的观测组合在一起, 但BY值不必按字母或数字顺序排列, 此选择项可出现在BY语句
中任何地方。
10.CARDS与CARDS4语句
该语句标志着后面紧跟着数据行。通常用前者, 格式为: CARDS;并用一个分号(独占一
行)作为数据行结束的标志; 当数据行中含有分号作为输入数据时,用后者,格式为: CARDS4;
并用4个连续的分号“;;;;”(独占一行)作为数据行结束的标志。
Ⅱ.用在DATA步的运行语句
1.赋值语句
如∶X=3; 或Y=a+b; 注意∶此处a、b是事先已赋过值的变量或是具体的数值。
2.累加语句
如∶N+1; 开始N被置为0,以后DATA步每执行一次,N的值就增加1。
3.DELETE语句
如∶DATA abc; INPUT x @@; IF x>100 THEN DELETE; CARDS; (数据行); RUN;
所建立的SAS数据集abc中就不会包含大于100的数值。
4.LOSTCARD语句
当每个观测写成几个数据行时,若当前观测丢失其中的一行或几行,LOSTCARD语句可以
防止SAS系统从下一个观测的数据行读数据作为当前观测的一部分。如∶
DATA abc; 103 C
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步每三个数据行作为一个观测。第1、4两个观测都丢失了两个记
录;第2个观测丢失了一个记录;第3、5两个观测是完整的。 新建立的数据集abc中只有
两个完整的观测,不完整的观测不会进入新建的数据集。
5.STOP语句与ABORT语句
按规定条件停止处理当前执行的DATA步,并继续执行其后的DATA语句或PROC语句。两者
的区别在于∶STOP语句属于正常停止执行当前DATA步,不输出出错信息; 而ABORT语句属于
异常中止执行当前DATA步,输出出错信息。使用的方法是∶
IF (条件) THEN STOP; IF (条件) THEN ABORT;
6.WHERE语句
该语句允许用户在SAS系统把观测读入DATA步之前从已存在的SAS数据集中选择符合特殊
条件的观测,常放在SET(设置)、MERGE(合并)、UPDATE(更新)语句之后使用。如∶
DATA one; SET aaa; WHERE x<100; RUN;
在把已存在的SAS数据集aaa复制到新数据集one之前,阻止aaa中与x≥100对应的所有观测进
入one中去。
WHERE语句不是可执行语句,它不能作为IF━THEN语句的一部分。它与子集IF语句的主
要区别在于∶在可用WHERE和子集IF语句时,WHERE语句的效率高得多;而子集IF语句可用在
DATA步的任何地方。
7.OUTPUT语句(输出语句)
该语句告诉SAS系统输出当前这个观测到正被创建的数据集中。当用户需要在以下三种
情况下控制观测值的正常输出时,OUTPUT语句很有用∶
①从每行输入数据创建二个或更多观测; ②从一个输入文件创建几个SAS数据集;③把
几个输入观测组合成一个观测。如∶
DATA a; DO i=1 TO 10; INPUT x @@; OUTPUT; END; RUN; (上述用途①)。
DATA b; IF x<50 THEN OUTPUT b1; ELSE OUTPUT b2; RUN; (上述用途②)
展开阅读全文