许振宇山东大学数学学院2006第三章SAS数据集的基本操作——程序实现许振宇山东大学数学学院2006§1SAS程序初步SAS程序程序步(Step)环境设置语句数据步(DataStep)过程步(ProcStep)用于创建、修改数据集。以DATA语句开头。实现面向数据集的操作,包括处理、计算、分析、呈现等功能。以PROC语句开头。许振宇山东大学数学学院2006•说明:–1.命令语句SAS程序步的基本组成单位。•1)一般形式:关键词操作对象……[选项]……[选项1|选项2|……];•2)形式:–开始标志:一个用于表示命令动作的关键词,–结束标志:分号“;”。–根据需要还可能包括若干可选项。•3)位置:–命令语句可以在行的任何位置开始,–一条语句可以占据一行或多行,多条语句也可以写在同一行。–语句中的各项之间用空格隔开。•4)字符:–命令语句中的英文字母不区分大小写,–汉字只允许出现在字符串中。许振宇山东大学数学学院2006–2.数据步的一般形式:DATA数据集名[选项];命令语句序列;RUN;–3.过程步的一般形式:PROC过程名[过程选项];过程语句序列;RUN;–4.程序步的结束:•遇到RUN语句或后面一个程序步开始时。•表示前面的语句可以提交运行了。许振宇山东大学数学学院2006§2有关库和逻辑文件的程序语句•1.标记一个数据库–一般形式:LIBNAME库标记[库引擎]库的实际物理地址[选项];–功能:建立指定的库标记与其物理位置的连接。–说明:•库标记必须指定,见库标记的命名规则;•数据源即文件夹的物理位置,一般从根目录开始指定其路径,并用一对引号(或)引起来;•库引擎根据创建库中数据集时的SAS版本号可选V6或V8,缺省值是当前SAS系统所用的引擎。例:libnamedst‘d:\dst’;run;许振宇山东大学数学学院2006•2.取消库标记–一般形式1:LIBNAME库标记CLEAR;–功能:取消指定的库标记与其物理位置的连接。–一般形式2:LIBNAME_ALL_CLEAR;–功能:取消所有用户设置的库标记与其物理位置的连接。许振宇山东大学数学学院2006•3.显示库的属性–一般形式1:LIBNAME库标记LIST;–功能:显示指定库的属性,包括库引擎、物理位置等。–一般形式2:LIBNAME_ALL_LIST;–功能:显示用户指定的所有库的属性,包括库引擎、物理位置等。许振宇山东大学数学学院2006•4.复合库的设置一个库可以对应于多个物理位置,即多个文件夹。–设置语句:LIBNAME库标记(位置1位置2……);–功能:建立指定的库标记与其若干物理位置的连接。–说明:位置可以是用引号括起来的实际物理地址,也可以是一个已经设定的库标记。例:libnamelib1'D:\dst\data1';libnamelib2(lib1‘D:\dst\data2’);libnamelib3('D:\dst\data1‘'D:\dst\data2’);许振宇山东大学数学学院2006•5.指定逻辑文件名–一般形式:FILENAME逻辑文件名文件的物理位置;–功能:创建指定的文件的逻辑文件名与其物理位置的连接。例:filenameflight'D:\dst\flight.dat';许振宇山东大学数学学院2006•6.查看库的内容–实现:过程步DATASETS–一般形式:PROCDATASETSLIB=库标记;RUN;–功能:在Log窗口中显示库的属性和它所包含的所有成员列表。例:procdatasetslib=sasuser;run;Proccontentsdata=sashelp.class;Run;许振宇山东大学数学学院2006结果如下:许振宇山东大学数学学院2006§3生成SAS数据集•1.数据步(DataStep)简介–1.1主要功能:•创建SAS数据集。•说明:数据必须以SAS数据集的格式保存才能被许多SAS过程处理。–1.2创建SAS数据集的途径:•直接在SAS系统中输入数据;import外部导入;•用数据步(DataStep)将外部数据文件转换为SAS数据集;•用SAS/ACESS模块访问其它数据库管理系统。–1.3数据在用数据步中的输入方式:•直接在数据步中输入数据;•将数据保存在文本文件中,数据步读取并生成数据集。许振宇山东大学数学学院2006SAS数据集直接输入数据库外部格式文件SAS过程步图1数据集中数据的来源许振宇山东大学数学学院2006•2.数据步的一般形式:DATA数据集名;INFILE文件名[选项];INPUT变量名变量输入设定;[其他SAS语句;]RUN;–功能:读取数据生成SAS数据集。许振宇山东大学数学学院2006–说明:•DATA语句:–标志数据步的开始–命名要创建的数据集(数据集名采用两级文件名的方式指定)。•INFILE语句:用于指定要读取的源文件,–源文件可以使用逻辑文件名,也可以输入其物理地址和全名(此时需要用一对单引号或双引号将源文件名括起来);–必须放在INPUT语句之前;–如果要在程序中直接嵌入数据,就用CARDS语句代替INFILE语句;也可以用infiledatalines;•INPUT语句:描述如何读取每一条观测,包括:–读取源文件中的数据行,–变量的命名,–变量的读取模式;许振宇山东大学数学学院2006•源文件:是扩展名为.dat或.csv的文本文件,其中:–数据行称为记录,对应于数据集中的观测,–一个数据行中的若干列组成一个具有特定含义的数据,称为字段,对应于数据集中的变量;•变量的读取模式:–按列模式(Column)字段开始列固定–格式化模式(Formatted)–列举模式(List)有固定字段分隔符–命名模式(Named)各模式分别对应不同的INPUT语句格式。•RUN语句:标志当前数据步的结束。•在数据步中我们还可以根据需要加入其它的SAS语句。许振宇山东大学数学学院2006•2.系统执行数据步的过程–编译数据步–执行数据步01MAR90LON19801MAR90FRA20701MAR90LON205……源数据文件DATEDESTBOARDED01MAR90LON19801MAR90FRA20701MAR90LON205……SAS数据集data...;infile...;input...;run...;数据步许振宇山东大学数学学院2006–2.1编译阶段•1)检查语句是否有词法或语法错误;•2)将数据步翻译为机器代码;•3)在内存中创建一个输入缓冲区(InputBuffer),用来存放源文件中的一条记录(一般是一行);012345678……许振宇山东大学数学学院2006•4)在内存中创建一个PDV(程序数据向量ProgramDataVector)用来临时存放当前观测;其中_N_表示当前处理的记录序号,_ERROR_是操作出错标志(0表示正常,1表示出错)。•5)根据PDV存储的信息创建数据集的描述部分。DATE$7DEST$3BOARDEDN8描述部分数据部分_N__ERROR_DATEDESTBOARDED10许振宇山东大学数学学院2006–2.2执行阶段•1)将PDV中的所有变量初始化为缺省值;•2)顺序执行数据步中的每条语句:•3)INPUT语句将源文件(INFILE语句指定)中的下一条记录(经输入缓冲区)读入PDV;•4)其它语句(如果有)修改PDV中的数据;•5)PDV中的数据在该数据步的结束处被写入正在创建的数据集;•6)回到数据步的开始,将PDV中的所有变量初始化为缺省值;•7)重复以上步骤直到外部文件结束。许振宇山东大学数学学院2006BEGINEND编译程序初始化变量执行INPUT语句文件结束Y执行其它语句写入SAS数据集N图2数据步执行的流程图许振宇山东大学数学学院2006图3读取外部文件生成数据集示意图外部文件集数据集InputBuffer_N__ERROR_DATEDESTBOARDEDPDV外存储器内存储器许振宇山东大学数学学院2006•3.在数据步中直接输入数据–一般形式:DATA数据集名;[INFILECARDS|DATALINES];INPUT变量名变量输入设定;CARDS|DATALINES;数据块;RUN;–功能:将包含在数据步中的数据块按照指定格式输入到新建的数据集中。许振宇山东大学数学学院2006–说明:•1)INFILE语句:–其中的CARDS或DATALINES选项告诉系统数据在数据步中直接输入,而不是读自源文件;•2)CARDS或DATALINES语句:–标明了数据块的开始;•3)数据块:–其中的数据形式由INPUT语句中的变量输入模式决定;–数据块中的每行数据需顶头写;–数据块输入完毕,位于下一行开始的分号说明了数据块的结束。许振宇山东大学数学学院2006–例1:datatmp1;inputxy;cards;123456789023;run;–说明:•1)新建数据集的二级文件名是work.tmp1;•2)x、y分别是数据集中的变量,系统根据随后输入的数据设置它们的格式。运行结果:许振宇山东大学数学学院2006–以上数据步也可以写作如下等价形式:datatmp1;inputxy@@;cards;123456789023;run;运行结果同上。•说明:跟踪符号“@”的作用–@:保留前一个INPUT语句使用的数据行供下一语句使用;–@@:在一个循环结束时仍然保留数据供下一循环使用。许振宇山东大学数学学院2006•4.读取外部文件生成数据集–4.1按列模式(Column)•1)适合的源文件–数据固定在某些列中;–数据中只包含标准的字符和数字。•2)INPUT语句的一般形式:INPUT变量名[$]开始列-结束列……;•3)说明:–变量名:指定要创建的变量名称;–$:可选项,出现说明变量是字符型的,否则说明变量是数值型的;–开始列C1-结束列C2:说明了变量对应的字段在源文件中的读取位置,即对每行数据从第C1个字符开始读取,直到第C2个字符;–在一条INPUT语句中可为多个变量定义输入方式,它们之间以空格分隔。许振宇山东大学数学学院2006–4)例子例2:假设有如下所示的文本文件flight.dat,描述了飞机航班的日期、目的地和乘客人数。01MAR90LON19801MAR90FRA20701MAR90LON205…………提交以下程序:dataflight;infile'd:\dst\flight.dat';inputdate$1-7dest$8-10boarded11-13;run;procprintdata=work.flight;run;许振宇山东大学数学学院2006结果如下:说明:–程序中包含了用于创建数据集work.flight的数据步,和用于显示数据集work.flight内容的过程步PRINT。–在没有给出输入输出格式的情况下,各变量的输入输出格式都采用默认值,即长度为8。–源数据行中的字段可以按照任意次序来读,也可以重复读取,例如:inputboarded11-13date$1-7dest$8-10year6-7;许振宇山东大学数学学院2006–对于数值型变量来说,源文件中只能提供标准数值数据值,即只能包含数字、小数点、正负号、E。而不能有$、逗号等符号。–某变量在源文件中对应列全为空格,则该变量读入的是一个缺省值。–按列模式也可以用于在数据步中直接读入数据例3:dataflight;infiledatalines;inputdate$1-7dest$8-10boarded11-13;datalines;01MAR90LON19801MAR90FRA20701MAR90LON205;run;此数据步提交结果与例2一样。许振宇山东大学数学学院2006•4.2格式化(Formatted)模式–1)适合的源文件•字段具有固定格式•含有不标准数据–2)一般形式:INPUT输入指针控制变量名输入格式……;许振宇山东大学数学学院2006–3)说明:•输入指针控制:将输入指针控制在源文件数