第二章SAS编程基础第一节常量、变量与观测值2.1.1观测值描述单一整体,如个别人、一个实验动物、一年、一个地区某些特性的一系列数据值称为观测值,又称观察。2.1.2变量给定特性的数据值的集合组成了变量。在SAS数据集中,每一个观测值是由各个变量的数据值组成。在数据集中每一列数据是一个变量。1.命名SAS变量名和其他名称如数据集名等的命名规则都相同,它可以多至8个字符长,第一个字符必须是字母(A,B,C,….,Z),或者是下划线(_),后面的字符可以是数字或下划线。空格不能出现在SAS名中,特殊字符(如$,@,#)也不允许在SAS名中使用。SAS系统保留了一定的名称作为特殊的变量名,这些名称以下划线开始和结尾。如_N_和_ERROR_等。2.变量特性SAS变量有两种类型,数值型和字符型。字符型变量在名后用一“$”号来表示。除了他们的类型外,SAS变量还有下列特性:长度、输入格式、输出格式和标记。变量的长度特性,是指在SAS数据集中用以存储它的每一个值的字节数。缺省长度是8(为了存储长度与缺省值不同的变量,需使用LENGTH语句)。变量的特性,或者明确地说明,或者在它们首次出现时的上下文中给出定义。例如:DATAA;C='BAD';PUTC;C='GOOD';PUTC;RUN;C在第一次出现时已被定义成字符型变量,长度为3,因此第二次再向c中赋值GOOD时,由于c已被定义成长度为3,故c中只存有‘GOO’。PUT语句的作用是把变量的值输出到LOG窗口。变量的其他特性将在后面逐渐介绍。3.变量清单的简化表示在SAS程序中定义了完整的变量清单后,就可以在后面许多语句中使用缩写变量清单形式。名称形式缩写意义形如:X1,X2,…Xn的带有序号的名称X1-Xn从X1到Xn的所有变量形如XPA*的名称范围X-A从X到A的所有变量X-NUMERIC-A从X到A的所有数值变量X-CHARACTER-A从X到A的所有字符变量特殊SAS名称_NUMERIC_所有数值变量_CHARACTER_所有字符变量_ALL_所有变量例如:INPUTNAME$VARlVAR2VAR3VAR4VAR5VAR6;也可以写成:INPUTNAME$VARl一VAR6;注意字符型变量NAME不包含在这个缩写清单中,有序号的变量不必全部列出,这些变量要求类型相同,或全是数值型的或全是字符型的。4.缺项值当一个变量由于某种原因没有得到(可能没有观测到,或由于数据错误;或由于计算错误),称该值为缺项值(又称缺失值).在SAS中用“.”表示。2.1.3常量SAS常量是一个数,或一个括在引号中的字符串,或者是一个指示固定值的特殊的标记。SAS常用3种常量:数值,字符,日期,时间或日期时间值。常量可被用于赋值、求和、IF、SELECT、RETAIN,PUT和ERROR语句中,或作为特定过程的可选项的值。1.数值常量数值常量可为正负整数和小数,对于过大和过小的数则用科学记数法表示。如:1.785E-9即1.785*10-9,对于数值型量的缺项值用“.”来表示。2.字符常量一个字符常量可由1至200个字符组成。例如:姓名Zhangli,性别Male等。字符型缺项值用空格来表示。3.日期、时间和日期时间常量用单引号括起日期时间值,后面接着用一个D(DATE)、T(TIME)或DT(DATETIME)来表示其类型。下面是几个例子:.'1JANl980'D.'9:25'T.'9:25:19'T.'18JAN80:9:27:05'DT为了将日期、时间或日期时间值赋给变量,应指出变量的输入格式或输出格式:TIME.、DATE.、和DATETIME.。第二节SAS函数SAS函数是一个程序,它对一个或多个参数进行计算后返回一个值。每一个SAS函数有一个关键字名,为了调用一个函数,写出函数名接着是括在括号中的一个或多个要进行计算的参数:函数名(参数,参数)当参数多于一个时,参数之间应该用逗号分隔,也可写成如下两种形式之一:函数(OF变量1-变量n)函数(OF变量1变量2变量3)例如下列形式是正确的:SUM(OFX1一X100Yl—Y100)SUM(OFXYZ)SUM(X1,X2,X3,X4)2.2.1算术函数ABS(x)返回x的绝对值DIM(array)返回数组中元素个数MAX(X,Y,…)返回X,Y….中的最大值MIN(X,Y….)返回X,Y….中的最小值MOD(X,Y)计算x/y的余项SIGN(x)返回参数x的符号或OSQRT(x)计算x的平方根还有LBOUND和HBOUND等函数。2.2.2数学函数EXP(x)e的幂LOG(x)产生自然对数LOG2(x)计算底为2的对数LOG10(x)计算底为10的常用对数DIGAMMA(x)计算GAMMA函数对数的导数还有ERF、ERFC、GAMMA、LGAMMA等函数。2.2.3三角函数和双曲函数COS(x)计算余弦SIN(x)计算正弦TAN(x)计算正切还有ARCOS、.ARSIN、ARTAN、COSH、SINH、TANH等函数。2.2.4概率函数PROBBNML(p,n,f)二项式(BINOMIAL)概率分布函数;PROBCHI(x,df)卡方概率分布函数PROBF(x,ndf,ddf)F分布函数PROBNORM(x)标准常规概率分布函数PROBT(p)STUDENT'ST分布函数还有POISSON,PROBBETA、PROBGAM、PROHYPR、PROBNEGB等函数。2.2.5分位数函数CINV(p,df,nc)卡方分布分位数FINV(p,ndf,ddf,nc)F分布分位数TINV(p,df,nc)T分布分位数还有BETAINV、GAMINV、PROBIT等函数。2.2.6样本统计函数MEAN(x,y...)计算算术均值STD(x,y,...)计算标准差SUM(x,y,...)计算参数和VAR(x,y,….)计算方差还有CSS、CV、KURTOSIS,MAX,MIN,N,NMISS,RANGE、SKEWNESS、STDERR,USS等函数。2.2.7随机函数RANNOR(x)产生一正态偏差RANUNI(x)产生一均匀偏差还有NORMAL,RABIN,RANCAU、UNIFORM、RANEXP,RANGAM、RANPOI、RANTBL、RANTRI等函数。2.2.8字符函数INDEX(a,b)求字符串b在字符串a中的位置LEFT(a)左对齐一个字符串LENGTH(a)返回字符串a的长度。RIGHT(a)右对齐一字符串TRIM(a)移走字符串尾部的空格还有BYTE、COLLATE、COMPRESS、INDEXC、RANK、REPEAT,REVERSE、SCAN、SUBSTR、TRANSLATE、UPCASE,VERIFY等函数。2.2.9日期和时间函数DATE()返回今天日期作为SAS日期值DAY(date)从SAS日期值返回月份中的日数YEAR(date)从SAS日期值返回年数还有DATEJUL、DATEPART、DATETIME、DHMS、HMS、HOUR、INTCK、INTNX、JULDATE、MDY、MINUTE、MONTHQTR、SECOND、TIME、TIMEPART、TODAY、WEEKDAY、YYQ等函数。第三节SAS操作符SAS操作符是表示需要作算术计算、比较或者逻辑操作的记号。2.3.1算术操作符算术操作符指出一个要执行的算术计算。算术操作符是:**乘方*乘/除+加-减对于一个算术操作符的操作数若为缺项值,结果也为缺项值。2.3.2比较操作符比较操作符要求SAS确定两个数据量间是否存在这种关系。如果不存在(换句话说如果它是假的)其结果值为0。比较操作符是:=或EQ等于^=或NE不等于或GT大于或LT小于=或GE大于等于=或LE小于等于对字符值比较也与数值比较一样,比较总是输出一个数值结果(1或0)。字符操作数被从左到右一个字符一个字符地按ASCII码值进行比较。比较算符主要用于条件语句中,但也可用于赋值语句中,例如:IFXYTHENC=15;ELSEC=12;可写成:C=15*(XY)+12*(X=Y);2.3.3逻辑操作符逻辑操作符也叫布尔算符。它通常用在连接一系列比较表达式中。符号如下:&AND|OR^NOT如果AND两端都为真,那么AND操作的结果是1。例如表达式:AB&C0仅当AB为1(真)和C0为1(真)时,也就是当A小于B,且c为正时,该表达式为真(值为1)。如果OR两端至少有一个为l(即为真),那么OR操作的结果为1(真),否则OR操作结果为0值。例如表达式:AB|C0只要两个关系中有一个成立时其值即为真。2.3.4其他操作符这些操作符是(MIN),(MAX)和||(连接)和算符放在两个量之间,其结果如果用的是则取其中最小值,如果用的是则取其中最大值。例如,如果AB那么AB的值为A。||算符联接两个字符值。例如,如果变量COLOR的值是'RED',同时变量NAME的值为‘BAG’,那么:M=COLOR||NAME;M的结果值是REDBAG。如果在连接前要从各个值中滤掉尾部空格,可使用TRIM函数。2.3.5SAS表达式表达式是由一系列操作符和操作数形成的一条指令,它被执行时产生一个结果值。表达式可以是简单的(仅用一个操作符),或复合的(使用多个操作符)。下面是表达式的例子:.X+1.3.LOG(Y).PART/ALLL*100.1一EXP(N/(N一1)).AGE100.STATE='NC'|STATE='SC'·A=B=C在DATA步编程语句中使用表达式,以转换变量,建立新的变量,进行条件处理,计算新值和赋新值。注意:在操作中,如对数值量进行了字符操作或对字符型数值量进行了数值操作,SAS会自动地进行相应的转换。例如:A='3';B='5';C=A+B;结果C为8。第四节在数据步中所用的语句下面列表简述在数据步中所用的语句及作用。表2.2文件操作语句语句作用DATA表明数据步的开始,并指明所建立的数据集名称.INPUT表明数据的变量名、顺序、类型CARDS表明数据行的开始,它一定要放在其他语句后面CARDS4当数据含有分号时,用来指示数据行的开始,用“;;;;”表示数据结束INFILE如果数据来自外部文件,则用INFILE语句指明文件名SET从另一数据中读入数据或将两个数据集中的数据纵向连接MERGE将两个数据集中的各观测值横同合并UPDATE利用一个数据集中的数据项更新另一数据集中相应的项FILE指出文件名表2.3作用语句语句作用赋值产生变量或改变变量值求和计算累加和建子集IF仅处理满足IF语句规定条件的观测值DELETE删除观测值OUTPUT将数据矢量流中的内容写入数据集MISSING规定特殊的缺项值STOP中断数据步表2.4控制语句语句作用IF-THEN/ELSE条件判断GOTO转向语句DODO组开始循环DO根据控制变量的变化进行循环ENDDO组结束LINK转向标记指出的程序处执行,遇到RETURN语句返回到该LINK语句的下一语句处继续执行RETURN返回到DATA步开始处或LINK语句的下一语句表2.5信息语句语句作用ATTRIB指明变量特性FORMAT指定变量输出格式INFORMAT指定变量输入格式LABEL进一步明确变量名所代表的意义LENGTH说明变量的长度特性RETAIN设变量初始值RENAME改变变量名ARRAY定义数组BY定义分组处理DROP指定不写到数据集中的变量KEEP指定要写到数据集中的变量第五节数据步流程在数据步中,DATA语句总是标志着这个步的开始。对输入数据中的每一观测值都执行一遍这个程序。在DATA步中提及的所有变量都成了当前数据矢量的一部分。来自每一输入数据源的变量与程序语句建立的变量一起放在程序数据矢量中。当执行到DATA步中的最后一条语句(或者一个引起返回到该步的开始,去重新执行的RETURN语句)时,通常从程序数据矢量中将当前值写到正被建立起的SAS数据集中。SAS返回到DATA语句后的第一个语句,初