第3章-SAS编程基础_第1页
第3章-SAS编程基础_第2页
第3章-SAS编程基础_第3页
第3章-SAS编程基础_第4页
第3章-SAS编程基础_第5页
已阅读5页,还剩114页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章SAS编程基础本章内容提要3.1SAS语法基础3.2DATA步3.3PROC步3.4SAS语句编程练习3.1.1SAS常数SAS常数是SAS系统可以识别的一些固定值。包括数值常数、字符常数。1.数值常数数值常数包括数字、小数点、符号及科学计数法中的E记号等。例:1,–5,1.23,1.2E232.字符常数字符常数是由引号括起来的1-200个字符组成,如果字符常数本身带有引号,此时应再次用引号括起来。

例:”TOM”、‘Tom’;

3.1SAS语法基础3.1.2SAS变量变量名以字母或者下划线开头,大小写不敏感,最多32个字符,可以用变量标签(Label)对变量进行说明,最多256个字符。1.数值型变量日期、时间等变量存为数值型,数值型变量在数据集中的存储一般使用8个字符。2.字符型变量字符型变量缺省的长度为8个字符,其后加符号$,变量名与$之间可以相连也可以有一个空格。SAS操作符是一些符号,主要有算术操作符、比较操作符、逻辑操作符。1.算术操作符(执行一种算术运算)+、-、*、/、**、||(字符串并接)2.比较操作符(建立变量之间的关系)LT、GT、EQ、LE、GE、NE<、>、=、<=、>=、^=3.逻辑操作符(连接一系列比较式,常与if语句结合使用)

AND、OR、NOT&、|、^3.1.3SAS操作符SAS表达式是把常量、变量用运算符、函数、括号连接起来得到一个计算结果的算式。可以对变量作变换和赋值,创建新变量,计算新数值以及控制条件语句的运行等。例:X+10;X+Y;Height>160;3.1.4SAS表达式3.1.5SAS函数1.SAS函数定义和表示SAS函数是SAS系统中编好的子程序,它对若干个变量进行计算后返回一个结果值。SAS提供了比一般程序设计语言多的标准函数,有数学函数、字符串函数、统计分布函数、分位数函数、随机数函数、日期时间函数、财政金融函数等。SAS函数的形式:函数名(X1,X2,…):SUM(X1,X2,Y1,Y2)函数名(OF变量1…变量N)

:SUM(OFX1X2Y1Y2)函数名(OF变量1-变量N):SUM(OFX1-X20)注意:两种写法不能混写,如SUM(OFX1,X2,X3)和SUM(X1-X3)都是错误的。用函数可以简化程序不使用SAS函数:total=xl+x2+x3+x4+x5+x6+x7+x8+x9+x10;

iftotal<ythenleast=total;elseleast=y;使用SAS函数:least=min(sum(ofx1-x10),y).函数分类常用函数功能数学运算函数ABS()取绝对值SQRT()求平方根INT()取整数部分EXP()求e次幂LOG()求e为底的自然对数SIN()计算正弦LAGn()求给定变量滞后n期的取值样本统计函数MAX()求最大值MIN()求最小值MEAN()求平均值SUM()求和DIFn()求给定变量X的第n阶差STD()求标准差KURTOSIS()峰度系数2、一些常见的SAS函数:

日期时间处理函数DATE()/TODAY()取当日的日期值DAY()计算某月的那一日HOUR()计算小时TIME()取当日的时间YEAR()取年值字符函数INDEX()搜寻字符串的位置LEFT()字符串表达式左对齐SUBSTR()抽取子字符串TRIM()移走尾部空格LENGTH()给出字符变量的长度UPCASE()转换为大写财政金融函数COMPOUND()计算复利IRR()计算内部赢利率NPV()计算净现值概率分布函数:

PROBNORM(x):标准正态分布函数,该函数计算服从标准正态分布的随机变量U小于给定x的概率;PROBCHI(x,df,nc):卡方分布函数。该函数计算服从自由度为df,非中心参数为nc的分布的随机变量小于给定x的概率。如果nc没有规定或取为0,那么被计算的就是中心分布。PROBF(x,ndf,ddf,nc):F分布的分布函数,该函数计算服从分子自由度为ndf,分母自由度为ddf,非中心参数为nc的F分布的随机变量小于给定值x的概率。如果nc没有规定或取为0,那么被计算的就是中心F分布。PROBT(x,df,nc):该函数计算服从自由度为df,非中心参数为nc的T分布的随机变量。如果nc没有规定或取为0,那么被计算的就是中心T分布。PROBBNML(p,n,x):此函数给出参数为p和n的二项分布随机变量小于给定x的概率。随机数函数是进行随机模拟的基础,SAS系统提供11种随机数函数分别是:均匀分布随机数:UNIFORM(seed),seed必须是常数0、5位、6位或者7位的奇数;RANUNI(seed),seed为任意常数;正态分布随机数:NORMAL(seed)、RANNOR(seed);指数分布随机数:RANEXP(seed);伽马分布随机数:RANGAM(seed);二项分布随机数:RANBIN(seed);泊松分布随机数:RANPOI(seed);随机数函数例:用函数NORMAL产生正态分布随机数。dataRV;doi=1to1000;a=normal(0);output;

end;procprintdata=rv;run;用函数RANNOR产生正态分布随机数。dataRV;mu=10;sigma=3;doi=1

to

1000;Normal1=mu+sigma*rannor(0);/*均值为mu,标准差为sigma*/output;end;dropmusigma;run;3.1.6SAS语句SAS语言的基本单位是SAS语句,一般由关键字、SAS名、特殊字符和运算符组成的字符串,并以分号结尾;SAS语句分为两大类:DATA步和PROC步,每一步都是一段相对完整的可以单独运行的程序。数据步(DATA)以DATA关键词开头,其主要作用是建立和整理SAS数据集以及自编程计算;该程序步设计非常灵活,可以根据要求设计不同的语句。过程步(PROC)以PROC关键词开头,面向已有的SAS数据集,调用SAS已编好的处理过程对数据进行处理。各种统计分析方法在SAS中大都以“过程”的形式存放在SAS过程库中,当我们需要进行某种统计分析时,只需用PROC步去调用相应的过程,即可得到所需要的分析结果,如进行基本统计分析、回归、画图、排序、打印等。例:Data

sasuser.da1;input

name$X1X2X3;Y=X1+X2+X3;cards;M31.30.5M22.40.9F53.20.8M84.11.1F73.30.6;Procprintdata=sasuser.da1;run;SAS语句的书写规则语句可在行的任一列开始,以“;”结束;一个语句可以分写为多行,多个语句可以写在同一行;语句中各项之间至少用一个空格隔开;不区分大小写。应遵守的书写规则(比较规范的书写有助于阅读和检查,还可以减少书写错误)

:每条语句都要另起行;不同程序步间留空行。3.2.1利用DATA步从原始数据创建SAS数据集一个DATA步的基本语句有:

DATA语句:表示创建SAS数据集;

INPUT语句:对数据集的变量进行描述;

CARDS语句:表示数据行的开始;;语句:表示数据行的结束。3.2DATA步Datawork.ex1;inputname$X1X2X3;Y=X1+X2+X3;cards;M31.30.5M22.40.9F53.20.8M84.11.1F73.30.6;run;创建数据集ex1,且保存在逻辑库work下指定数据集中的变量名,各变量之间用空格分开表示数据行的开始,数据行中不能有“;”表示数据行的结束如果要在一行中输入几个观测的数据,需要加“@@”符号1.DATA语句:

表示DATA步的开始,并给出你要产生的SAS数据集的名字。若想保存你的数据为永久性数据集,必须使用双水平名字,如sasuser.ex1;若不想保存你的数据为永久性数据集,你可以输入Work.data-set-name(数据集名)或直接输入数据集名。根据需要,还可以在DATA后面同时定义多个数据集的名字,以形成观测或变量的子集。见P312.INPUT语句:INPUT语句用于描述输入的变量和格式,对每个变量给出名字、类型和格式,如果变量为字符型,在变量名后加$,变量之间用空格隔开。3.CARDS语句:数据行写在CARDS语句与只有一个顶头的分号“;”行之间。数据输入的格式有自由式、列格式、有格式和命名式四种。(1)自由式:只需将变量名简单列在INPUT后,输入的数据以空格隔开。自由式使用简单,输入数据时不用上下对齐,不需要知道每个变量的列数只需知道它的次序。例:dataoranges;inputvariety$flavortexturelooks;

cards;navel986temple777valencia899mandarin578;Run;(2)列格式:在INPUT语句变量名后紧跟着变量在数据行中所占据的列起始位置和结束位置,如Inputname$1-10X112-15;变量在读取数据时把前10个列字节作为变量name的值,把第12列到第15列的字节作为变量X1的值,以此类推。列格式输入数据的特征:数据行各项上下对齐或各项之间可以没有任何分隔,连续写在一起;数据长度可以超过8个字符,中间可以有空格;可以只输入数据行中某些项而忽略其他项。Datascore;inputname$1-10sex$11-13math14-16chinese17-20;cards;李明男9298张红一女89106王思明男8690;Procprintdada=score;run;Dataa;inputa$1-5b7-9;cards;www3333yyyy333333;Procprintdada=a;run;Dataids;inputyear7-10mon11-12day13-14;cards;110103197512092232110101196902150059;Procprintdada=ids;run;(3)有格式:在INPUT语句变量名指定输入的格式,同时指明变量的数据类型和区域宽度。如Inputname$5.x13.1表明变量name是字符型的,且占5个字节,而变量x1则是数值型的,占3个字节空间,且有一位小数。此时输入的数据前5列为变量name的值,而第6列到第8列则为变量x1的值,且必须有一位小数。即当输入的数字没有占满6到8列,数据集首先读入小数位数字,然后再读入整数位数字。

Dataa;inputa$5.b3.1;cards;www333www3333www33333yyyy33.3333;Procprintdata=a;run;(4)命名式:在INPUT语句变量名之后加上“=”,此种数据输入方式在数据行中含有变量的名字,后面跟着“=”和变量值的情况下使用,SAS系统在输入的数据中寻找变量名和等号。Datada1;inputidname=$15.age=;cards;200012name=marryage=15200015age=16name=john200011age=16name=smithandtom;Procprintdata=da1;run;定义变量属性:变量的属性包括:(1)字符型还是数值型:INPUT语句读入字符型数据时要在变量后面加$符号;(2)变量标签(LABEL):可以给变量加一个长度不超过40个字符的标签;(3)变量存储长度(LENGTH);(4)变量的输出格式(FORMAT):指定如何显示变量值。指定变量属性的语句格式:ATTRIB变量名属性属性为“属性名=属性值”,可以为一个变量同时指定多个属性。Datasasuser.da1;inputname$X1X2X3;ATTRIBnamelabel=“姓名”;Y=X1+X2+X3;cards;M31.30.5M22.40.9F53.20.8M84.11.1F73.30.6;Proc

printdata=sasuser.da1;run;

3.2.2赋值语句和累加语句1.赋值语句一般格式:variable=expression;赋值语句将表达式计算的结果赋给变量(variable)。需要注意的是:表达式中的变量必须已被赋值,否则作为缺省值处理。例如:X=Y+Z*3;X=SUM(Y,Z);avg=(math+chinese+english)/3;2.累加语句累加语句将表达式的计算结果加到累加变量上作为累加变量新的观测值,累加语句常用来计数。一般格式:variable+expression;其中Variable是定义累加变量的名字,它必须是数值型的,且第一个观测被读入前它自动地被赋值为0,表达式(expression)可包含SAS操作符、SAS函数,用来进行数学运算等。例:n+1;例3.3:下列数据是2008-2009学年第2学期某班部分学生语文、数学和英语考试成绩,试利用累加语句对总分超过240的学生进行计数。考试成绩如下:827869907889798698765680727681697891927185根据题目要求,程序编辑如下:dataclass;inputchinesemathsenglish@@;total=chinese+maths+english;iftotal>=240thenn+1;elsedelete;Cards;827869907889798698765680727681697891927185;procprint;run;3.2.3DROP和KEEP语句可以根据数据集的需要,选用和删除一些变量,此时可以使用这两个语句,格式为:DROPVARIABLES;KEEPVARIABLES;

DROP=VARIABLES;KEEP=VARIABLES;由于DROP和KEEP语句的作用正好相反,使用DROP语句时也可以使用KEEP语句。实际中为了书写方便,在保留变量较少时,常用KEEP语句,而在删除变量较少时,使用DROP语句。语句选项

注意:在KEEP语句和DROP语句中,不加“=”,而在数据集后使用KEEP选项或DROP选项时需加“=”;变量之间用空格隔开;KEEP语句和DROP语句对当前正在创建的所有数据集均起作用,而在数据集后使用KEEP选项或DROP选项仅对在他前面的数据集有效,对其他数据集不起作用。dataclass4;inputname$chinesemathsenglish@@;keepnametotal;total=chinese+maths+english;cards;a827869b907889c798698;与dataclass4(keep=nametotal或drop=chinesemathsenglish);inputname$chinesemathsenglish@@;total=chinese+maths+english;cards;a827869b907889c798698;结果是一样的3.2.4IF语句1.条件IF语句条件IF语句含有一个THEN子句,用来执行满足IF条件的那些观测。如果某个观测不满足IF条件,则THEN子句不被执行,此时可以使用ELSE语句来执行有关的运算。如果没有规定ELSE语句,则SAS系统执行紧跟在IF后面的下一个语句。其一般格式是:IFconditionTHENstatement;<ELSEstatement;>

例3.5:dataclass1class2;inputname$chinesemathsenglish@@;total=chinese+maths+english;iftotal>=240then

outputclass1;else

outputclass2;cards;a827869b907889c798698;procprintdata=class1;title'数据集class1';procprintdata=class2;title'数据集class2';run;

例3.10:dataclass;inputsex$chinesemathsenglish@@;total=chinese+maths+english;

ifsex='m'theniftotal>=240then

output;

else

put'total<240';else

put'sex=f';cards;m827869f907889m798698m765680f727681f697891m927185;procprint;run;IF-THEN-ELSE语句可以嵌入一个或多个IF-THEN-ELSE语句:dataclass;inputsex$chinesemathsenglish@@;total=chinese+maths+english;

ifsex='m'theniftotal>=240then

output;

elsedelete;elsedelete;cards;m827869f907889m798698m765680f727681f697891m927185;procprint;run;2.子集IF语句

子集IF语句不包含THEN子句,它仅对满足IF条件的那些观测进行处理。

其一般格式是:IFexpression;如果某观测使表达式的计算结果非0或非缺省,则认为条件成立,SAS系统把当前观测读入到正被创建的SAS数据集中,并继续执行此后的语句;否则,SAS系统返回到DATA步,对其他观测执行DATA步,该观测不被读入正被创建的SAS数据集中,IF语句后的语句也将不再执行。如:Ifplace=“shanghai”;ifsex=“f”;3.2.5OUTPUT语句、DELETE语句与PUT语句

1.OUTPUT语句OUTPUT语句指定SAS系统输出当前的观测到指定的SAS数据集中。其一般格式是:output<数据集名1>…<数据集名N>;output后的括号中的数据集名是可选项。当没有该选项时,SAS系统把当前这个观测输出到DATA语句命名的所有数据集上,并返回到DATA步开始处理此后的语句。当有该选项时,SAS系统把当前这个观测输出到output语句规定的所有数据集上,并返回到DATA步开始接着处理此后的语句。这里数据集名可以多于一个,但必须在DATA语句中已被命名。2.DELETE语句DELETE语句把符合条件的观测从正在创建的数据集中删去,并返回到DATA步开始处理其他观测。如:Dataclass3;inputsex$chinesemathsenglish@@;Ifsex=“m”thendelete;cards;m827869f907889m798698;procprint;run;SAS数据步的输出一般是数据集,除此之外,SAS也提供了一个PUT语句,该语句可以将输出结果显示在LOG窗口中。PUT语句的输出结果默认情况下被输出到日志窗口,但在PUT语句之前用FILE语句可以改变PUT语句的输出目的地,如在PUT语句之前用’fileprint;’可以把PUT语句输出到输出窗口。3.PUT语句练习1、P43实验2.1;2、P46习题2.2、2.3,在编辑器中建立SAS数据集;3、P34例2.2;4、P56例3.5;5、P59例3.7;6、P63例3.10.

3.2.6DO语句DO语句是一种循环语句,即在DO与END语句之间的这些语句被作为一个单元处理,称为DO组。常见DO语句有以下四种形式:简单DO语句、循环DO语句(计数)、DOWHILE语句(当型)、DOUNTIL语句(直到型)。(1)简单DO语句(自身没有控制变量)简单DO语句常常用在IF-THEN-ELSE语句里,用来执行当IF条件成立时的一组语句,在IF条件不成立时,跳出这组语句去执行其它SAS语句。其一般格式是:DO;其它SAS语句;END;例3.12:dataclass;inputsex$chinesemathsenglish@@;ifsex='m'then

do;

total=chinese+maths+english;n+1;

end;ave=sum(chinese,maths,english)/3;cards;m827869f907889m798698m765680f727681f697891m927185;procprint;run;(2)循环DO语句循环DO语句是指DO与END之间的语句被重复执行的语句,其一般格式为:

DOindex-variable=start<tostop><BYincrement>;其它sas语句;end;其中:index-variable:控制(计数)变量,它的值控制着执行情况及执行次数;Start为控制变量的初始值,当同tostop(结束值)或BYincrement(步长)一起使用时,程序先把控制变量赋值为初始值,如果此值小于等于结束值则执行循环体语句,然后把控制变量加上步长继续执行循环体,直到控制变量的值大于结束值为止。省略步长时默认为1。

例:dataa;doi=1to20by2;j=i**3;output;end;run;

11327512573439729111331132197153375174913196859

例3.13:利用循环语句和随机正态函数产生参数为5的随机数50个:dataa(drop=ijz);doi=1to50by1;y=0;doj=1to5;z=rannor(0);y=y+z*z;end;output;end;run;Procprintdata=a;run;

(3)DOWHILE语句该语句规定当WHILE后的表达式(其值是在每次循环开始前被计算)运行的结果为真时,重复地执行DO组中的语句。其一般格式为:

DOWHILE(expression)。(4)DOUNTIL语句该语句规定直到UNTIL后的表达式运行的结果(其值是在每次循环结束后被计算)为真时,循环结束。其一般格式为:DOUNTIL(expression);

例3.14:dataclass;inputsex$chinesemathsenglish@@;

doi=1to10by2while(nlt2);total=chinese+maths+english;n+1;

end;ave=(chinese+maths+english)/3;cards;m827869f907889m798698m765680f727681f697891m927185;procprint;run;

例3.14:dataclass;inputsex$chinesemathsenglish@@;

doi=1to10by2until(nlt2);total=chinese+maths+english;n+1;

end;ave=(chinese+maths+english)/3;cards;m827869f907889m798698m765680f727681f697891m927185;procprint;run;3.2.7SET语句SET语句的用法:调用一个已存在的SAS数据集(复制数据集);对已存在的SAS数据集进行修改;把几个已存在的SAS数据集连接成一个新的数据集。

1.调用一个SAS系统已存在的数据集利用SET语句可以调用一个已经存在的SAS数据集,以便对数据进行其他处理。一般格式为:DATAnewdata-set-name;SETolddata-set-name;如:

dataclass1;setclass;

2.对已存在的SAS数据集进行修改利用SET语句可以从一个已经存在的SAS数据集创建新的数据集,一般格式为:DATAnewdata-set-name;SETolddata-set-name<options>;SET后的选择项有两种情况:一是利用KEEP、DROP选项或语句生成部分变量的子集;二是利用WHERE、IF语句生成部分观测子集。Dataclass1;Setsasuser.class(drop=namesex);run;Dataclass1;Setsasuser.class;Total=chinese+maths+english;Iftotal>=270thenoutput;run;

3.数据集的纵向合并(1)相同变量顺序连接此种方式下,各SAS数据集含有相同的变量,SET语句将各数据集按照顺序把所有观测连接在一起,即使两个观测完全相同也应按顺序连接起来,新数据集的观测数目是所有这些数据集观测数目之和。dataclasses;setclass1class2class3class4;run;例3.15:dataA;inputname$sex$@@;cards;rosefdavidmjohnmmayersf;dataB;inputname$computerphysicalmathsenglish@@;cards;rose89657687david78867898john90657687mayers89(2)不同变量顺序连接。连接的几个数据集含有不同的变量,将具有相同变量的观测连接起来,而没有变量取值的观测为缺失值。连接后的变量个数为所有数据集变量数之和。677880;dataC;inputsex$totalave@@;cards;f31779.25m34085m31879.5f31478.5;dataABC;setABC;run;procprint;run;(3)按同一变量顺序连接。首先按共同变量排序,连接后所形成的新数据集,首先读入第一个数据集中第一个BY组中的观测,然后读入第二个数据集中相同BY组中的观测,以此类推,直到读完所有BY组中的观测。

dataA;inputname$sex$@@;cards;rosefdavidmjohnmmayersf;dataB;inputname$computerphysicalmathsenglish@@;cards;rose89657687david78867898john90657687mayers89677880;dataC;inputsex$totalave@@;cards;f31779.25m34085m31879.5f31478.5;dataA;setA;run;procsort;bysex;run;dataC;setC;run;procsort;bysex;run;dataAC;setAC;bysex;run;procprint;run;3.2.8MERGE语句(数据集的横向合并)MERGE语句把两个或两个以上的SAS数据集的变量合并为一个新的SAS数据集的变量。其一般格式为:

MERGEdata-set-name-1<(option-1)>data-set-name-2<(option-2)>…<data-set-name-n<(option-n)>>;1.一对一合并。其合并过程为:按MERGE语句后面数据集的排列顺序,把第一个数据集中的第一个观测与第二个数据集中的第一个观测,……,第N个数据集中的第一个观测合并成新数据集中的第一个观测……以此类推,直到所有观测被合并为止。合并时,以下几点需要注意:合并后新数据集的观测总数为参加合并的数据集中观测的最大值。在合并时,如果某数据集没有某一个或几个观测,则其对应的变量值以缺失值代替。在合并时,如果某几个数据集有共同变量,则合并后的新数据集仅含有一个该变量,其对应的值为列在MERGE语句最后一个含有该变量的数据集中的该变量观测值。dataA;inputname$sex$@@;cards;rosefdavidmjohnmmayersf;dataB;inputname$computerphysicalmathsenglish@@;cards;rose89657687david78867898john90657687mayers89677880;dataC;inputsex$totalave@@;cards;f31779.25m34085m31879.5f31478.5;dataABC;MERGEABC;run;procprint;run;2.匹配合并。每一个数据集至少有一个共同变量,且首先按共同变量进行排序,此共同变量称为匹配变量,通过BY组排序后形成的每一个组称为BY组,匹配合并实际上就是BY组之间的一对一合并。合并时,以下几点需要注意:对每一个BY组,新数据集中的BY组的观测个数是各合并数据集中相应BY组观测数的最大值;对不同的BY组,SAS系统首先处理那些BY值较小的观测,然后再处理BY值较大的观测;在同一BY组中,按MERGE语句后面数据集的排列顺序,把各数据集对应BY组的第一个观测进行合并,形成新数据集中的第一个观测,以此类推没直到所有观测被合并为止。如果某一数据集在某一BY组中没有观测,则按缺省值处理。如果某一数据集含有多个具有相同BY值的观测,则合并时输出所有这些观测,其它数据集对应的BY组,如果没有相应的观测,则取该BY组最后一个观测作为当前观测与之合并。如果某个变量同时出现在几个数据集中,但是这个变量又不是匹配变量,则在新的数据集中,这个变量只出现一次,此变量值为最后一个数据集含有该变量的观测值。

例3.16:dataA;inputname$sex$@@;cards;benjimmrosefdavidmjohnmmayersfmayersm;procsort;byname;run;dataB;inputname$compphysmateng@@;cards;rose89657687david78867898david87697790john90657687mayers89677880star66817594

;procsort;byname;run;dataAB;mergeAB;byname;run;procprint;run;排序的结果NAMECOMPPHYSMATENGdavid78867898david87697790john90657687mayers89677880rose89657687star66817594NAMESEXbenjimmdavidmjohnmmayersfmayersmrosef3.2.9WHERE语句WHERE语句是一个条件语句,它可以从已存在的SAS数据集中把满足条件的观测输出到新的SAS数据集中,它不能用在由CARDS语句构成的DATA步中,也不能从外部文件中选择记录。其一般格式是:WHEREwhere-expression;WHERE语句中的表达式where-expression是由操作符、数字、变量组成的算术或逻辑表达式,如:wheretotal>240;wherex;wheresex=“m”;wheretotalin(257263)在执行WHERE表达式时,SAS系统首先对第一个观测计算,根据其取值决定是否执行WHERE后的其它SAS语句:如果表达式计算的结果为真则执行,如果为假,则不执行并返回到DATA语句继续处理第二个观测,直到所有观测都被处理完为止。数值型变量的名字如“X”可以单独出现在WHERE表达式中,如果该变量值为0或缺省,则该表达式运算结果为假,否则为真。在DATA步中,WHERE语句必须跟在SET、MERGE语句之后,并对SET、MERGE语句中的所有数据集都适用,WHERE表达式中的变量也必须是这些数据集中所具有的。例:dataclass;inputsex$chinesemathsenglish@@;total=chinese+maths+english;cards;m82.69f90089m798698;dataclass1;setclass;wheremaths;run;procprintdata=class1;run;Between-And算符:该算符选择变量值落在某个范围内的观测,范围的界限可以是常数或表达式,其一般格式为:WHEREVARIABLEBETWEENVAULEANDVAULE;如wherescorebetween60and100SameAnd算符:除满足已选的条件外,还满足and后的条件的观测。

例3.9dataclass;inputsex$chinesemathsenglish@@;total=chinese+maths+english;cards;m827869f907889m798698M808080;

dataclass1;setclass;

wheretotal>180;

wheresameandtotal<240;run;procprintdata=class1;run;子集IF语句和WHERE语句的比较相同点:两者都是条件语句,都需要根据其后的表达式计算结果来判断条件成立与否,在很多情况下两者输出的结果也是一样的。不同点:WHERE语句在观测读入到程序语句之前起作用,而IF语句对已经在程序内的观测起作用。因此在选择观测时,WHERE语句往往比子集IF语句更有效。WHERE语句仅能处理已存在的SAS数据集中的观测,而子集IF语句不仅能处理已存在的SAS数据集中的观测,也可以处理用INPUT语句产生的观测。dataa;inputxy@@;cards;115378590;datab;inputxz@@;cards;169289498;datawhereab;mergeab;wherex>2;run;procprintdata=whereab;run;dataa;inputxy@@;cards;115378590;datab;inputxz@@;cards;169289498;dataifab;mergeab;ifx>2;run;procprintdata=ifab;run;例3.11:使用WHERE语句的运行结果:Obsxyz47898590.Where语句先对数据使用where语句,然后再进行其他语句的执行:xyxz78498590使用IF语句的运行结果:Obsxyz149098if语句先对数据进行合并,再执行if语句:xyz115692788949098总结DATA步PROC步DATAscore;inputname$sex$mathchineseenglish;total=chinese+maths+english;cards;王华F

929886金一M

899693赵磊M869088…….;PROCprintdada=score;run;DATA步PROC步从原始数据创建SAS数据集:DATA、INPUT、CARDS、“;”;调用已有的数据集:SET;选择一部分观测创建新的SAS数据集:IF…OUTPUT、IF…DELETE、WHERE;选择一部分变量创建新的SAS数据集:KEEP、DROP;控制语句:IF…THEN…<ELSE>、DO;数据集的纵向合并:SET;数据集的横向合并:MERGE;赋值语句与累加语句:表达式。……PROC步是用PROC开始的SAS语句,是SAS系统进行处理和分析数据的语句。PROC步的一般格式为:

PROCproc-name<options>;

过程语句<options>;过程语句<options>;

……RUN;

3.3PROC步3.3.1SAS过程步中的常用语句1.PROC语句该语句指定要进行的分析方法。其一般格式为:PROCproc-name<options>;其中:

proc-name

表示用户要调用的SAS过程名:对数据集做某种变换的过程名,如SORT过程等;所要进行的统计分析方法,如MEANS过程、REG过程等。

options规定此过程的一个或几个选项,多个选项用空格隔开。例:Procmeansdata=myclass.score18maxdec=3summeanrange;表示系统调用均值过程,并计算数据集score18中各数值变量的和、均值和极差,并保留3位小数。2.其它过程语句在PROC语句之后、结束语句之前可以有若干个可选的过程语句,用来对PROC语句进行具体设置,主要有:

VAR语句:指定分析变量;WHERE语句:指定待分析的观测子集;BY语句和CLASS语句:指定分组变量;ID语句:指定标识变量;WEIGHT语句和FREQ语句:指定权重变量和频数变量;MODEL语句:指定模型形式;LABEL语句和FORMAT语句:指定变量标签和输出格式;OUTPUT语句:指定输出结果存放的数据集及输出结果形式。(1)VAR语句该语句用来指定分析变量,在VAR后面给出变量列表,各变量名之间用空格隔开。其一般格式为:VARvariable-name-1…variable-name-n;例:Var

weightheight;

Var

x1-x5y;(2)WHERE语句该语句可以选择数据集的一个观测子集来进行分析。一般格式为:WHEREexpression;例:where

math>=60andchinese>=60;(3)BY语句和CLASS语句BY语句用来指定一个或几个分组变量,根据这些分组变量的取值将观测分组,然后对每一组观测分别进行本过程进行的分析。!SAS系统要求首先应按分组变量进行排序。

其一般格式为:BYvariable-name-1…variable-name-n;例:假定数据集myclass.score18已按变量sex排序,则程序Procprintdata=myclass.score18;by

sex;run;将产生男、女生分开输出的两个数据集列表。Class语句同样表示按指定的变量进行分组。与BY语句不同,使用CLASS语句进行分类分析,分类变量不需要事先进行排序。其一般格式为:CLASSvariable-name-1…variable-name-n;当BY语句和CLASS语句同时使用时,系统首先按BY变量进行分组,然后再在每一组中按CLASS变量进行分组。例:Procprintdata=myclass.score18;classsex;run;(4)ID语句该语句表示用指定的变量来标识观测。在输出窗口中,系统默认用观测的序号来区分观测,当使用ID语句时,输出的观测用ID变量的值来识别,而观测的序号则不输出。!ID变量值与观测应一一对应。其一般格式为:IDvariable-name;(5)WEIGHT语句和FREQ语句WEIGHT语句用来指定权数变量,可以用权数变量对其它变量进行加权,通常用在每个观测的重要性不同的情形下。该变量值应大于0,小于0或缺省时取值为0。其一般格式为:WEIGHTvariable-name;FREQ语句用来指定各观测出现的频数或次数。若变量的值<1或缺省,相应的观测不参加计算统计量;若取值不是正整数,则取整数部分。其一般格式为:FREQvariable-name;WEIGHT语句与FREQ语句之间的区别:两者表示的观测次数不同;两者的取值范围不同。(6)MODEL语句该语句在统计建模过程中指定模型的形式,等号左边的变量为因变量,等号右边的变量为自变量。其一般格式为:MODELdependent-variables-name=independent-variables-name<options>;例:modely=x1-x5;y1y2=x1x2x3x4x5;(7)LABEL语句和FORMATLABEL语句为变量指定一个临时标签,FORMAT语句为变量输出规定一个输出格式。过程步中规定标签和输出格式只用于此过程的本次运行,而数据步中的标签和输出格式是附属于数据集本身的,是永久的。procprintdata=myclass.score18label;idname;varmathchinese;

label

name=姓名math=数学成绩chinese=语文成绩;

format

math5.1chinese5.1;run;(8)OUTPUT语句该语句用来指定输出结果存放的数据集名以及输出内容在新数据集中的名称。其一般格式为:

OUTPUTout=data-set-namekeywords=variable-name;其中:“out=”给出输出结果数据集的名字;“keyword=variable-name”指定输出哪些结果及其在输出数据集中的名字。procmeansdata=myclass.score18;varmath;

outputout=resultn=nmean=meanmathvar=varmath;run;procprintdata=result;run;3.3.2.几个常用的SAS过程1.SORT(排序)过程SORT过程将SAS数据集按一个或几个变量的次序进行排序。其一般格式为:PROCSORT<options>;BY<descending>variable-1…<descending>variable-n;其中,<options>指定进行排序的数据集和输出的数据集的名字:DATA=data-set-name;OUT=data-set-name。BY语句指定排序变量:可同时指定多个排序变量;关键词descending。例:对数据集myclass.score18中的数据,先按性别升序排序,再按级降序排序。Procsort

data=myclass.score18out=paixu;By

sexdescendinggrade;Run;Procprint;Run;2.PRINT(打印)过程该过程用于输出SAS数据集中的内容,以便于检查数据输入是否正确。其一般格式为:PROCPRINT<options>;VAR语句;WHERE语句;ID语句;LABEL语句和FORMAT语句;BY语句/CLASS语句;

PAGEBY语句;SUM语句;TITLE语句和FOOTNOTE语句;

(1)PROCPRINT<options>;该语句是PRINT过程唯一必需的,options选项有:DATA=data-set-name:指定所要打印的数据集,如省略则打印最新生成的SAS数据集;N:要求在输出这个数据集的数据列表之后同时输出观测的个数。如果使用BY语句,在每个BY组的数据输出之后同时输出该BY组的观测个数;NOOBS:不输出观测数据的序号。

(2)VAR语句:指定输出列表中的变量及其顺序;(3)WHERE语句:只输出满足条件的观测;(3)ID语句:指定输出列表中的标识变量;(4)LABEL语句和FORMAT语句:指定输出变量的标签和格式;(5)BY语句/CLASS语句:指定分类变量,打印输出时按分类变量的取值不同分组显示。procsortdata=myclass.score18;bysex;run;procprintnnoobs;

bysex;run;(6)PAGEBY语句:PAGEBYvariable;该语句指定分页变量,打印输出时如果分页变量的取值发生变化则在新的一页上输出。!使用pageby变量必须同时使用sort过程,并且pageby变量与sort过程中的by变量和print过程中的by变量一致。datasample;inputxyz@@;Cards;111123178954342455667143562;

procsort;byx;

run;procprint;byx;pagebyx;run;(7)SUM语句:SUMvariables;

该语句用来指定一个或多个求和变量。当同时使用BY语句时,求和过程同时计算每组合计和总和。datasample;inputxyz@@;Cards;111123178954342455667143562;procsort;byx;run;procprint;byx;sumyz;run;(8)TITLE语句和FOOTNOTE语句:TITLE’标题内容’

或FOOTNOTE’脚注内容’

该语句用来指定输出结果的标题和脚注,它们均为全程语句:可以用在DATA步和PROC步内,也可以单独使用;具有持续性,用没有内容的空title/footnote语句取消指定的标题或脚注;procprintdata=myclass.score18;title10级1班学生期末成绩表;footnote2012年3月29日;run;(9)对输出结果的管理

RESULT(结果管理窗口):可调用“view-result”打开;HTML格式输出:调用“tools-opitions-preferences”菜单。3.TRANSPOSE(转置)过程TRANSPOSE过程把原SAS数据集行列互换,转置为一个新的SAS数据集。其一般格式为:PROCTRANSPOSE<options>;VAR语句;ID语句;BY语句;

COPY语句;

PROC语句中<Options>的内容:DATA=data-set-name;OUT=data-set-name;PREFIX=name;NAME=name。VAR语句指定转置变量。

ID语句指定输入数据集中的一个变量为输出数据集中观测的标识变量。BY语句指定转置的分组变量,分组变量取不同值的数据作为一组进行转置,但BY变量本身并不参加转置。COPY语句中列出的所有变量直接输出,不被转置。

DataA;Inpu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论