1、SAS表达式及函数简介,SAS表达式,SAS表达式是由一系列算符和运算对象形成的一个指令集,它被执行后产生一个目标值。运算对象是SAS变量和SAS常数;算符是特殊的运算符、函数和括号。表达式分为简单表达式和复合表达式。 下列式子都是表达式。 X+1 3 LOG(X) LOG10(X) P/A*100 AGE100 1-EXP(N/(N-1) A=B=C STATE=CA在DATA步中,为了对变量进行变换,建立新变量、条件处理、计算新值及指定新值,都需要使用SAS表达式。,一、SAS常数SAS常数用来表示固定的值,它或者是一个数字,或者是用引号引起来的字符串、或者是其它特殊记号。SAS使用的常数
2、有五种类型:数值常量、字符常量、日期、时间和日期时间常量、十六进制数值常量、十六进制字符常量。我们主要介绍数值常量、字符常量和日期常量。1.数值常量:一个数值常量就是出现在SAS语句里的数字。数值常量可以包括小数点,负号和E记号。例如:1 -5 1.23 1.2E23 0.1 0.5E-10。用E表示法时,如2E4,它表示 ,或者20000。SAS系统中,数值缺失值用小数点来(.)表示。,2.字符常量字符常量是由(单)引号括起来的字符串.例如,在下面的语句中:IF name=TOM THEN DO;TOM就是一个字符常量。如果字符常量含有引号,则用两个连续的单引号来处理。例如,字符值为TOMS
3、时,输入:name=TOMS 缺失的字符常量值为空字符,表示为或”(两个连续的单引号或双引号)。注意,下面语句中 TOM不是字符常量,而是按变量处理!IF name=TOM THEN Score=85;,3. 日期、时间常量:日期时间常量是将日期时间由(单)引号括起来,后面加上d或t或dt而形成的。例如:日期常量:15may2008d时间常量:16:45:01t日期时间常量:15may2008: 16:45:01dt注意:日期格式为:DDMMMYY 或 DDMMMYYYY 即,月份需要用三个英文字母表示,二 SAS变量:描述给定特征的数值集合的指标称为变量。SAS变量的特征: 变量名、类型、存
4、储长度、标签、输入格式、输出格式,存储长度指变量在存储时所需要的字节数。默认情况下所有的变量都定义为8字节。字符变量的长度可为1-32768字节,数值变量的长度可为3-8字节。 标签是对变量的补充说明,可以为任意字符,长度可多达256个字符。,SAS数据集(部分),Observations,输入输出格式,原始数据值,SAS 变量的值,格式化的 SAS变量值,Dollar10.,Comma8.,548,231,25JAN2004,16095,01/25/2004,Date9.,MMDDYY10.,$548,231,548231,日期和时间数据的存储,SAS采用数值存储日期和时间形式的数据。在默认
5、情况下,SAS系统以0代表1960年1月1日0时。 其它日期在SAS系统中被存储为与该日期相差的天数。 例如,1960年1月3日,在系统中存为2。2004年1月25日,在系统中存为16095。注意:为了使数值型变量显示日期形式,必须使用日期型的输出格式,同样地为了以日期形式输入日期必须使用日期型的输入格式。,SAS变量分为两类,数值变量(Num)与字符变量(Char)。数值型变量只能取数值为值。可以有正负号及小数点(+、),但不能有逗号(,)。 数值型是SAS的默认变量类型,默认长度为8位。字符型变量可以取字符、字母、特殊字符以及数字为值。在DATA步中某些SAS语句中,第一次出现的变量名后跟
6、一个美元符号($),即表明该变量是字符型变量,如name$ 或name $。如果变量后不加$符号,SAS将该变量认为数值型。在SAS中一个字符变量的取值可以有1-32768个字符长,默认长度为8个字符长;或由第一次赋值时字符长度决定。,创建变量,使用赋值语句Data a;x=1;run;/*数据集a中有个变量x,值为1,为数值型*/使用INPUT语句Data b;Input x $ y z;Datalines;Aaa 23 45;Run; /*创建三个变量,x为字符型,y、z为数值型*/,变量类型转换,字符自动转换为数值(无法转换为数值时,取缺失值),data; X=1; /*X为数值变量 *
7、/ Y=10; /*Y为字符变量 */ X=Y; /*将字符变量赋值给一个数值变量时,自动将字符变量Y转换为数值变量 */ run;data; X=1; /*X为数值变量 */ Y=10; /*Y为字符变量 */ Z=X+Y; /*算术表达式中有字符变量时,自动将字符变量Y转换为数值变量 */ run;,函数INPUT将字符转换为数值,INPUT函数的形式: INPUT(数据源, 输入格式);其中: 数据源为要转换为数值的变量,常数或表达式。数据源既可以是数值型,也可以是字符型。 输入格式规定对数据源进行转换的输入格式。,data a; y=input(“12345“,5.2); run;,数
8、值自动转换为字符,data; X=abcd; /*X为字符变量 */ Y=123; /*Y为数值变量 */ X=Y; /*自动将数值变量Y转换为字符变量 */ run;注意:将数值变量赋给字符变量时,结果会受到字符变量长度的影响!长度不足时,SAS尽量转换成能够满足长度限制的结果,即科学记数法。,数值转字符之后的格式:data; Y=10; /*Y为数值变量 */ Z=ROOM|Y; /*自动将数值变量Y转换为字符变量 */ put Z=; run;data ; Y=10600001; /*Y为数值变量 */ Z=SUBSTR(Y,7,6); /*自动将数值变量Y转换为字符变量 */ put
9、Z=; run;,Z=ROOM 10,Z=600001,系统自动地将数值转换为字符时,使用BEST12.的输出格式,字符值右对齐,不足12位时左侧以空格补齐。,函数PUT将数值转换为字符,PUT函数的形式:PUT(数据源, 输出格式);其中:数据源为要转换为字符值的变量,常数或表达式。数据源既可以是数值型,也可以是字符型。输出格式规定对数据源进行转换的输出格式。,data a; x=put(34.416,5.2); y=input(“12345“,5.2); run;,data; X=1; /*X为数值变量 */ Y=10; /*Y为字符变量 */ if XY then k=1; /*字符与数
10、值变量进行比较时,自动将字符变量Y转换为数值变量 */ run;data; Y=10; /*Y为字符变量 */ Z=log(Y); /*需要数值变量的函数中引用字符变量时,自动将字符变量Y转换为数值变量 */ run;,自动变量,自动变量是由数据步语句自动创建的。这些自动变量被加入到程序数据向量(PDV)中,但是并不输出到数据集中。自动变量在重复过程中被保留,而不是被设定为缺失。 如,_n_ _error_ first.byvar last.byvar _numeric_all_ 等,例:使用自动变量_Numeric_。 data one; set sashelp.class; keep _n
11、umeric_; /* 只保留数据集中的数值变量*/ run;,三 SAS算符SAS算符是一些符号,它们要求作比较、算术运算或逻辑运算。SAS使用两种主要类型的算符:前缀算符和中缀算符前缀算符用于变量、常数、函数或者用括号括起来的表达式。例如: +Y -25 -COS(A) -(x1+x2-100)前缀算符有:加号,减号,NOT和符号。中缀算符作用在算符两边的运算对象上,例如68 。中缀算符一般分为四类:算术算符、比较算符、逻辑算符和其它算符(最大、最小和连接)。,1.算术算符:算术算符表示执行一种算术运算,包括:* 乘方 * 相乘 / 相除 + 相加 - 相减如果算术算符有一个运算对象是缺失
12、值,运算结果也是缺失值。例如,y=x3 + . ; 则y的值为缺失值(.) 2.比较算符:比较算符确定两个量之间的一种关系,如果这种关系成立,则输出结果为1(真);如果它不成立,则输出结果为0(假)。比较算符包括:= (EQ) 等于 = (NE) 不等于 (GT) 大于 = (GE) 大于等于 = (LE) 小于等于 (1)算术表达式的比较考虑表达式:A=B。如果A的值为4,B的值为3,则表达式A=B的值为0(假);若A的值为5,B的值为9,则表达式A=B的值为1(真);若A与B的值均为47,则表达式成立,且其值为1。,(2)字符的比较比较的对象可以是数值也可以是字符,但比较的结果总是数值1(
13、真)或0(假)。字符运算对象在字符之间从左到右被比较。字符次序用机器排列次序确定(即按ASCII码排列序列)。例如,表达式GRAYADAMS是真的,它与表达式 ANDRE ,CANDRE,CLYDE一样,它们的值都是1。3.逻辑算符:逻辑算符也称为布尔(Boolean)算符,在表达式里通常用来连接一系列比较式。逻辑算符包括:&(AND) 与; | (OR) 或; (NOT) 非例如,age=25 AND sex=男 或 age=25 & sex=男 age=25 OR sex=男 4.运算次序:关于运算次序,SAS有如下的三个准则:准则1:在括号里的表达式先计算;准则2:较高优先级的运算先被执
14、行。,下面是各运算符的优先等级(排在前面的优先):1级 *、(not)2级 *、/3级 +、-、4级 、=、 、 2*(3*2) 2) 当两个比较算符围着一个量时,则等价于一个and运算。例如:12 12age and age20,SAS函数,一 .SAS函数的定义 1.SAS函数的定义:SAS函数是一个子程序,它由0个或几个自变量(参数)返回一个结果值。每个SAS函数都有一个函数名,及用括号括起来的参数,这个函数对这些自变量执行某种运算。即使没有参数也需要括号。 SAS函数的形式:FunctionName(arg1,arg2,arg3,.)例如:MEAN(x,y,z,a)SUM(x,y,z)
15、MIN(SUM(x,y,z),1000)TODAY(),2. SAS函数的分类:SAS函数分为20多种类型,常见的有:算术函数、数组函数、截取函数、数学函数、概率函数、分位数函数、非中心函数、样本统计函数、随机函数、字符函数、日期时间函数等。,二 SAS函数的参数,参数类型 变量名 常数 函数 表达式 函数及其参数类型举例。,参数个数:有些函数不需要参数,有些只需要一个参数,有些函数有多个参数。SAS9.1中,参数个数不能超过32767。如果函数的参数是表达式,在函数被调用之前,所有表达式参数首先计算。 参数的表示法一般地,当函数有几个参数时,它们之间必须用逗号(,)分隔开。不过,以下三种写法
16、均是合法的:Function Name(OF variable1-variablen)Function Name(OF variable variable .)Function Name(variable, variable, .)例如: sum(of x1-x5) sum(of x1 x2 x3 x4 x5)sum(x1,x2,x3,x4,x5) 是等价的。,正确与错误的表示方法数组元素自变量的缩写方法 array y10 y1-y10; /*定义数组y10 */ x=sum (of y*); z=sum (of y1-y10);两个SUM函数的表示法是等价的。,函数结果,通常函数的结果由其
17、参数的属性决定:返回结果是字符时结果变量为字符;返回结果是数值时结果变量为数值。根据缺省规则,对大多数函数来说,数值目标变量的长度是8,字符目标变量的长度通常由返回结果的长度决定,三. 常用的SAS函数 1、数学函数 ABS(x) 求x的绝对值。 MOD(x,y) 求x除以y的余数。 SQRT(x) 求x的平方根。 ROUND(x,eps) 求x按照eps指定的精度四舍五入后的结果,比如ROUND(5654.5654,0.01) 结果为5654.57 CEIL(x) 求大于等于x的最小整数。当x为整数时就是x本身,否则为x右边最近的整数。 FLOOR(x) 求小于等于x的最大整数。当x为整数时
18、就是x本身,否则为x左边最近的整数。 INT(x) 求x扔掉小数部分后的结果。 LOG(x) 求x的自然对数。 LOG10(x) 求x的常用对数。 EXP(x) 指数函数 。 SIN(x), COS(x), TAN(x) 求x的正弦、余弦、正切函数。 等等,2、数组函数数组函数计算数组的维数、上下界,有利于写出可移植的程序。数组函数包括:DIM(x) 求数组x第一维的元素的个数。 DIM k(x) 求数组x第k维的元素的个数,如dim2(x)、dim3(x)。 LBOUND(x) 求数组x第一维的下界。 HBOUND(x) 求数组x第一维的上界。 LBOUND k(x) 求数组x第 k维的下界
19、。 HBOUND k(x) 求数组x第 k维的上界。例: DATA A; ARRAY SC2,3 X1-X6 (6*0); /*定义数组SC*/ D1=DIM(SC); D2=DIM2(SC); HB=LBOUND(SC); HB2=HBOUND2(SC); RUN; PROC PRINT; RUN;,3、字符函数较重要的字符函数有: TRIM(s) 返回去掉字符串s的尾随空格的结果。 UPCASE(s) 把字符串s中所有小写字母转换为大写字母后的结果。 LOWCASE(s) 把字符串s中所有大写字母转换为小写字母后的结果。 INDEX(s,s1) 查找s1在s中出现的位置。找不到时返回0。
20、REPEAT(s,n) 字符表达式s重复n次。 SUBSTR(s,p,n) 从字符串s中的第p个字符开始抽取n个字符长的子串 TRANWRD(s,s1,s2) 从字符串s中把所有字符串s1替换成字符串s2。 LENGTH(s) 返回字符串s 长度 COMPRESS(s1,s2) 从字符串s1中删除字符串s2 LEFT(s) 字符串s左对齐还有如,COLLATE,LEFT,REVERSE,RIGHT,SCAN ,TRANSLATE,COMPBL等,4、日期时间函数 常用日期和时间函数有: MDY(m,d,yr) 生成yr年m月d日的SAS日期值 YEAR(date) 由SAS日期值date得到年
21、 MONTH(date) 由SAS日期值date得到月 DAY(date) 由SAS日期值date得到日 WEEKDAY(date) 由SAS日期值date得到星期几 QTR(date) 由SAS日期值date得到季度值 HMS(h,m,s) 由小时h、分钟m、秒s生成SAS时间值 DHMS(d,h,m,s) 由SAS日期值d、小时h、分钟m、秒s生成SAS日期时间 DATEPART(dt) 求SAS日期时间值dt的日期部分 INTNX(interval,from,n) 计算从from开始经过n个interval间隔后的SAS日期。其中interval 可以取YEAR、QTR、MONTH、WE
22、EK、DAY等。比如,INTNX(MONTH, 16Dec1997d, 3)结果为1998年3月1日。注意它总是返回一个周期的开始值。 INTCK(interval,from,to) 计算从日期from到日期to中间经过的interval间隔的个数,其中interval取MONTH等。比如,INTCK(YEAR, 31Dec1996d, 1Jan1998d)计算1996年12 月31日到1998年1月1日经过的年间隔的个数,结果得2,尽管这两个日期之间实际只隔1年,5、分布密度函数、分布函数SAS提供了多种概率分布的有关函数。分布密度、概率、累积分布函数等可以通过几种统一的格式调用,格式为 分
23、布函数值 = CDF( 分布, x );密度值 = PDF( 分布, x ); CDF计算由分布指定的分布的分布函数 PDF计算分布密度函数值分布类型: BERNOULLI, BETA, BINOMIAL, CAUCHY, CHISQUARED, EXPONENTIAL, F, GAMMA, GEOMETRIC, HYPERGEOMETRIC, LAPLACE, LOGISTIC, LOGNORMAL, NEGBINOMIAL, NORMAL 或 GAUSSIAN, PARETO, POISSON, T, UNIFORM, WALD 或 IGAUSS, and WEIBULL 分布类型可以只写
24、前四个字母。 例如PDF(NORMAL, 1.96)计算标准正态分布在1.96处的密度值(0.05844) CDF(NORMAL, 1.96)计算标准正态分布在1.96处的分布函数值(0.975),5、分布密度函数、分布函数SAS还单独提供了常用的分布的密度、分布函数。PROBNORM(x) 标准正态分布函数 PROBT(x,df) 自由度为df的t分布函数。可选参数nc为非中心参数。 PROBCHI(x,df) 自由度为df的卡方分布函数。可选参数nc为非中心参数。 PROBF(x,ndf,ddf) F(ndf,ddf)分布的分布函数。可选参数nc为非中心参数。 PROBBNML(p,n,m
25、) 设随机变量Y服从二项分布B(n,p),此函数计算P(Y m)。 POISSON(lambda,n) 参数为lambda的Poisson分布Y n的概率。 PROBNEGB(p,n,m) 参数为(n,p)的负二项分布Y m的概率。 PROBHYPR(N,K,n,x) 超几何分布的分布函数。设N个产品中有K个不合格品,抽取n个样品,其中不合格品数小于等于x的概率为此函数值。可选参数r是不匀率,缺省为1 ,r代表抽到不合格品的概率是抽到合格品概率的多少倍。 PROBBETA(x,a,b) 参数为(a,b)的Beta分布的分布函数。 PROBGAM(x,a) 参数为a的Gamma分布的分布函数。,
26、6、分位数函数分位数函数是概率分布函数的反函数。其自变量在0到1之间取值。分位数函数计算的是分布的左侧分位数。SAS提供了六种常见连续型分布的分位数函数。PROBIT(p) 标准正态分布左侧p分位数。结果在5到5之间。 TINV(p, df ) 自由度为df的t分布的左侧p分位数。nc为非中心参数。 CINV(p,df) 自由度为df的卡方分布的左侧p分位数。nc为非中心参数。 FINV(p,ndf,ddf) F(ndf,ddf)分布的左侧p分位数。nc为非中心参数。 GAMINV(p,a) 参数为a的伽马分布的左侧p分位数。 BETAINV(p,a,b) 参数为(a,b)的贝塔分布的左侧p分
27、位数。,7、随机数函数 均匀分布随机数UNIFORM(seed),seed必须是常数,为0,或5位、6位、7位的奇数。RANUNI(seed),seed为小于 2*31-1的任意常数。 正态分布随机数NORMAL(seed),seed为0,或5位、6位、7位的奇数。RANNOR(seed),seed为任意数值常数二项分布随机数RANBIN(seed,n,p)产生参数为(n,p)的二项分布随机数,seed为任意数值。 泊松分布随机数RANPOI(seed,lambda)产生参数为lambda0的泊松分布随机数。 通用函数RAND(分布名,参数1, 参数k) 分布名:BERNOULLI、BETA、
28、BINOMIAL、CAUCHY、CHISQUARE、ERLANG、EXPONENTIAL、F、GAMMA、GEOMETRIC、HYPERGEOMETRIC、LOGNORMAL、NEGBINOMIAL、NORMAL|GAUSSIAN、POISSON、T、TABLE、TRIANGLE、UNIFORM、WEIBULL例如, x= RAND(NORMAL); 返回标准正态分布随机数x= RAND(NORMAL,5,2); 返回均数为5,标准差为2的正态分布随机数x= RAND(T,26); 返回自由度为26的t分布随机数,8、样本统计函数 样本统计函数把输入的自变量作为一组样本,计算样本统计量。 调用
29、格式为“函数名(变量1,变量2,变量n)” 如果要求x1,x2,x3的和,可以用SUM(x1,x2,x3) 样本统计函数只对变量中的非缺失值进行计算,缺失值不纳入计算。 各样本统计函数为:MEAN 均值 MAX 最大值 MIN 最小值N 非缺失数据的个数 NMISS 缺失数值的个数。SUM 求和 VAR 方差 STD 标准差STDERR 均值估计的标准误差,用STD/SQRT(N)计算。CV 变异系数 RANGE 极差 CSS 离差平方和USS 平方和 SKEWNESS 偏度 KURTOSIS 峰度注意:数据集的存储一般是每行为一个个体的观测值,每列是个体的一个变量,所以统计一般应该对列进行,而不是对行进行。上述函数是对行进行处理,因此,样本统计函数主要用于进行一些自编程的计算。若要对每一列进行统计,需要用过程步,如proc means等,谢谢,