




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章 用编程读入数据建立sas数据集4.1 sas编程基本概念4.1 概述sas语言程序由数据步和过程步组成。sas语言的基本单位是语句,每个sas语句一般由一个关键字(如 data,proc,input,cards,by)开头,包含sas名字、特殊字符、运算符等,以分号结束 。sas关键字是用于sas语句开头的特殊单词,sas语句除了赋值、累加、注释、空语句以外都以关键字开头。sas名字在sas程序中标识各种sas成分,如变量、数据集、数据库,等等。数据步和过程步数据步用来生成数据集(从数据片中或外部数据文件中读取数据)、计算整理数据等。语法: data 数据集名;.;run;过程步:面向SAS数据集,完成某个特定的计算、分析和呈现功能语法: proc 过程名;.;run;sas程序的书写规则sas程序是由一至多个数据步骤(data step)和过程步(Procedure Step)互相交叉组合而形成。根据各个数据步骤的属性或过程步的功能,来实现sas数据文件的建立、进行统计分析等。sas系统的编译方式是以数据步或过程步为一个区块来编译的,语法编译无误便开始执行该数据步或过程步,执行完整一个数据步或过程步区块后便继续处理下一个数据步或过程步。一个区块接一个区块地将所有程序代码编译及执行完后,便完成了该程序的执行。sas程序代码提交出去,便已将程序交由sas系统去完成。用户必须确定sas系统在log窗口中是否有显示错误的程序代码,分析数据的属性是否正确。sas的程序代码是自由格式的程序代码,每个语句由关键词开始,以“;”作为一个程序语法的结束;一行可以含多个程序语句;一个程序语句也可以分成多行,但必须以空格(只要有一个空格的地方,就可用任意多个空格来替代)为分隔。注:在命令框中键入num即可显示或取消行数。指定逻辑库名与逻辑文件名指定逻辑库名在sas系统中只有sas数据集才能被sas过程直接调用,sas数据集的结构和dbf数据库完全相同。sas数据集存储在被称为sas数据库的文件集中,在pc系统中,sas数据库与某一个文件夹相对应,为了避免直接书写较长的实际地址,最好为每一个数据库指定一个库标记(库名)来识别该库,使用Libname命令可以指定库标记。语法:libname 逻辑库名 库的物理存储位置;上述指定的目录,必须在程序执行前就建好,否则无法使用。libname 库名 list;在log窗口显示该逻辑库的连接情况(即列出库名对应的物理置).libname 库名 clear;取消该逻辑库的设置.libname _all_ list; 显示所有逻辑库的设置.libname _all_ clear;取消所有逻辑库(不包括系统提供的)的设置.libname 逻辑库名(物理位置1 物理位置2);为多个物理位置指定同一个逻辑库名.若多个位置对应一个逻辑库名,则逻辑库的属性中的levels取值为物理位置的个数,在存储文件时,文件存在levels=1的物理位置,调用文件时,系统会自动搜索所有物理位置。指定逻辑文件名定义逻辑的文件名称,以供SAS系统程序中使用。语法:filename 逻辑文件名 文件的物理存储位置 ;引用:逻辑文件名逻辑文件名(文件名)注:如指定的文件位置并不存在,系统并不报错,但引用逻辑文件名时,错误的逻辑文件位置会报错。此同逻辑库不同。逻辑文件名可同已有的逻辑库同名,因在不同地方引用,不混淆。例:#libname dst d:dst;libname dst list;libname dst;libname dst clear;libname _all_ list;libname _all_;libname _all_ clear;filename dst d:data;filename dst list;filename dst;filename dst clear;filename _all_ list;filename _all_;filename _all_ clear;#注:1 libname dst d:dst;中的文件夹dst要先在window系统中建好,否则无法建立此逻辑库,运行此命令会提示错误;2 filename dst d:data; 中的文件夹data也要先在window系统中建好,运行此命令会无错误提示;但引用此逻辑文件名时会提示错误。4.1.3查看逻辑库和数据集的属性和内容查看sas逻辑库的属性和内容语法:proc datasets lib=逻辑库名;run;查看sas数据集的属性和内容语法:proc contents data=数据集名;run;输出sas数据集的数据部分语法:proc print data=数据集名;run;4.2 用数据步读入(文本文件)数据生成SAS数据集4.2.1 数据文件格式与数据步的一般形式源数据文件格式:1.字段固定的源数据文件中数据的排列方式:(1) 每行安排一个观测量;(2) 每行各个字段都由相同的列开始.2.分隔符固定的自由格式的源数据文件每行可以安排一个或若干个观测量.观测值之间使用分隔符分隔.或者一个观测量可以占据多行. 输入模式:按列输入模式 格式化输入模式 列举输入模式 命名输入模式 混合输入模式。转换文本数据文件数据步的一般形式data 数据集名; infile 文件名;input 变量输入设定; run;注:1 数据集名为建立的数据集名,两级命名;2 源数据文件名,可用逻辑文件名;3 由源数据文件格式设定设定如何读入源数据文件的某个字段及用什么格式将其存为sas数据集的某个变量。例:按列输入模式读入外部数据文件#libname dst d:dst;filename dst d:data;data dst.indt01;infile dst(imptdt01);input id$ age$ actlevel$ sex$;run;proc print;run;#4.2.2 按列输入模式input 变量名1 开始列数-结束列数变量名2 开始列数-结束列数;注:1 变量名:为sas数据集中创建的变量的名称,按指定的大小写存放;2美元符号$:可选项,创建字符型变量需要;数值型变量无需此选项;3开始列数:读入字段在源数据行中的开始列数;4结束列数:读入字段在源数据行中的结束列数;5对每个要转换的字段都要写出上述信息设定。例:读入imptdt01.dat的input语句#input id 1-4age 6-7actlevel $ 9-12sex $ 14;#libname dst d:dst;filename dst d:data;data dst.indt01;infile dst(imptdt01);input id$ 1-4 age$ 6-7 actlevel$ 9-12 sex$ 14;run;proc print;run;#注:1“infile dst(imptdt01);”括号中文件无扩展名和引号引用方式为系统默认方式;2 可直接用物理地址代替:infile d:dataimptdt01.dat 3 input语句与源数据文件格式密切相关,下在各输入模式中分别介绍其及其选项。4 变量属性:name type missing_value length informat format label用proc contents data=dst.indt01;run;查看上述建立数据集变量的属性。注:长度(数值默认8,字符按输入宽度决定长度),输入输出格式都按缺省方式定。例4.1 imptdt02.dat#读入, 打印显示libname dst d:dst;filename dst d:data;data dst.indt02;infile dst(imptdt02);input date $ 1-7 dest $ 8-10 boarded $ 11-13;run;proc print;run;#调整字段输入顺序, 跳开输入, 重复输入。libname dst d:dst;filename dst d:data;data dst.indt02;infile dst(imptdt02);input date $ 1-7 dest $ 8-10 boarded $ 11-13 year 6-7;run;proc print;run;#注:按列输入源数据文件的优点1对字段的选取灵活,可任选字段和安排字段顺序;2整个字段或部分输入;3字段间未必要空格或其它分隔符;4字符变量值最多可含32k个字符,并可用空格;5 对缺失数据无特殊占位符的要求。一个空格字段就读为一个缺失值,也不引起其它字段读入错误。按列输入源数据文件的缺点虽可设定输入长度,但无格式设定,对数值变量只能读入标准数值数据,即由数字,正负号,小数点和E构成的定点和浮点数;对日期,含美元符号,含逗号和其它字符数据无法准确按格式输入,见上例;需要格式化输入。infile语句的选项infile 文件名 ;注:1不写按缺省方式输入;2调试时可用obs 限制读入行数。例:#libname dst d:dst;filename dst d:data;data dst.indt01;infile dst(imptdt01) firstobs=2 obs=5;input id$ age$ actlevel$ sex$;run;proc print data=dst.indt01;run;#从数据步中读入数据data 数据集名; infile datalines ; input 变量输入设定 ; datalines; 数据行 ;run;注:1 infile datalines 中若无时,此语句可省;2 datalines可用cards替代。4.2.3格式化输入模式1适用字段固定格式源文件数据;2给出开始列数,不给结束列数,由输入格式 给出读入长度;3 可设定输入格式;4 其它语句同按列输入模式。input 指针控制 变量名1 输入格式 变量名2 输入格式;指针控制: n: 从第n列开始读入(绝对位置), 1可省 ; +n: 列控制指针, 增加n列读入(相对位置);变量名:要创建的变量名;输入格式:该变量的输入格式。例:imptdt03.dat#input 1 lastname $7. 或 input lastname $7.#input lastname $7. 9 firstname $5.#input lastname $7. +1 firstname $5.#input lastname $7. 9 firstname $5 15 jobtitle 3. 19 salary comma9.#用到的一些格式说明$charw.:如果需要完全原样地输入字符型数据(包括头尾空格、单独的小数点),可以用有格式输入,即在字符型变量名和$符后加上一个输入格式如CHAR10.表示读入10个字符,并保留读入字符串前的空格符。P41-42$w.:如果需要完全原样地输入字符型数据(包括头尾空格、单独的小数点),可以用有格式输入,即在字符型变量名和$符后加上一个输入格式如10.表示读入10个字符,并删除读入字符串前的空格符。P41-42commaw.d:数据一般以包含逗号、空格、-、$的字符串形式出现在卡片或外部数据文件中;读入时系统可自动去掉这些符号。P43整个读入程序#filename dst d:data;data dst.indt03;infile dst(imptdt03);input LastName $7. 9 FirstName $5 15 JobTitle 3. 19 Salary comma9.;run;proc print data=dst.indt01;run;#注:1输入格式指定并不记入数据集变量属性中,采取默认的格式;proc contents data=dst.indt03;run;2可任意安排字段输入次序例4.2 imptdt02.dat#filename dst d:data;data dst.indt02;infile dst(imptdt02);input date date7. dest $3. boarded 3.;run;proc print data=dst.indt02;run;#注:从输出结果看date为数值型的,如何按常用的日期格式输出。format 变量名1 输出格式 变量名2 输出格式; #filename dst d:data;data dst.indt02;infile dst(imptdt02);INPUT date date7. dest $3. boarded 3.;Format date yymmdd10.;run;proc print data=dst.indt02;run;#注:1输入格式 datew. P46输入时允许在日月年之间加入空格和其他特殊字符,只要宽度足够,如ddMONyy(yyyy) 17oct91,宽度范围7-12,缺省宽度7;2 输出格式yymmddxw. P46yy/mm/dd宽度范围2-8,缺省宽度,8, 如91/10/173 infile 选项firstobs,obs同按列输入。4.2.4列举输入模式适用于分隔符固定的源数据,如数据文件:imptdt04.datinfile 文件名 ;input 变量名1 变量名2 ;1变量名:要创建的变量名;2 依次读入数据文件中各字段3源数据分隔符默认为空格,如源数据是空格分隔,可省#空格分隔符filename dst d:data;data dst.indt04;infile dst(imptdt04);INPUT gender $ age bankcard freqbank deptcard freqdept;run;proc print data=dst.indt02;run;#其它分隔符filename dst d:data;data dst.indt05;infile dst(imptdt05) dlm=,;INPUT gender $ age bankcard freqbank deptcard freqdept;run;proc print data=dst.indt02;run;#注:列举模式输入最简单,但有局限性:1 字段有至少一个空格或其它分隔符分开;2 字段自左至右依次读入,不能跳开或重复读入;3 对字符或数值变量的缺失值要用不同于分隔符的符号表示;4 由于变量长度缺省为8,超过8的被截断;proc contents data=dst.indt055无法使用输入格式;6 字符变量中不能含分隔符。length 变量名1 长度 变量名2 长度 ; 可克服截断#Data tem; Length city $9. Input city $ pop70 pop80; Cards;ANCHORAGE 48081 174431ATLANTA 495039 425022BOSTON 641071 562994CHARLOTTE 241420 314447;RUN;PROC PRINT DATA=TEM;RUN;#注:1 length可放input前或后,若放前,变量类型由length语句定;放后怎样?2 数据集中变量次序由input中语句定。带修饰的列举模式输入input 变量名:输入格式;#libname dst d:dst;filename dst d:data;data dst.indt06;infile dst(imptdt06);input city :$12. pop70:comma9. pop80:comma9.;run;proc print;run;proc contents;run;#注:1 不管输入格式如何写,每个字段读入的长度有分隔符定;2 数据集中变量长度,数值变量长度总是缺省的8,字符变量也是缺省8,但若length语句在input语句前,则按length设定。若length语句未作设定,则就是输入格式规定的读入宽度。4.2.5命名输入模式及混合输入模式命名输入模式要求数据文件中每个数据行都为各个字段指定变量名,且不便同模式混用。#data tem;infile cards;input name=$10. sex=$1. birthday= height=3.; informat birthday date7.;format birthday yymmdd10.;cards;name=Alex Bruce sex=M birthday=13Jun67 height=174 birthday=08aug54 sex=F name=Cathy Lee;run;proc print;run;注:1 变量名大小写相同; 2 数据行第2行变量次序可不同input中变量次序;3 informat 变量名 输入格式 变量名 输入格式.#注:此时用proc contents data=tem;run;查看变量属性informat栏有定义。#查看数据变量属性的例子data test;input date;informat date date7.;format date yymmdd10.;cards;01jan99;run;proc print;run;proc contents data=test;run;#注: informat语句和format语句要放在input 语句后面,否则有出错提示,如data test;input date;informat date date7.;cards;01jan99;format date yymmdd10.;run;proc print;run;proc contents data=test;run;#混合输入模式源文件不同字段用不同的读入模式#filename dst d:dst;data mixedimpt;infile dst(imptdt07);input ssn $ 1-11 12 hiredate date7. 20 salary comma6. department : $9. phone_no; format hiredate yymmdd10. salary dollar7.;run;proc print;run;#注:1 日期输入输出格式 datew.,p46; 2 日期输入输出格式 yymmdd 或 yyyymmdd, p46;3 输入格式 commaw.d, p43;4 输出格式 commaw.d, p43;5 输出格式 dollarw.d, p43.4.3 用数据步读入数据生成SAS数据集(二)4.3.1 数据步的编译和执行编译阶段:检查语法错误,建立数据集描述部分l 对程序进行语法和词语检查,看是否有错误;l 将程序转化为机器码,供执行阶段使用;l 建立工作部件 输入缓冲器;l 建立工作部件 pdv(程序数据列program data vector);l 确定数据集中各个变量的三个属性:变量名,类型,长度;l 建立数据集的描述部分。说明: l 输入缓冲器是一个存储区域,它只反映一个逻辑概念,不一定反映数据的物理位置.只在读外部源数据时才使用,读sas数据集时并不用.l pdv是sas建立数据集的存储区域.每次一个观测,它也像输入缓冲器一样是个逻辑概念. 包含两个自动生成的临时变量,可以在程序中象其它变量一样使用,但不写入数据集。 _n_:纪录数据步开始执行的次数; _error_:执行过程中若发生错误,值置为1,否则是0。l 也扫描数据步的每个语句: 关键词遗漏或拼法错误 无效的变量名 遗漏或错用标点符号 无效的选项#例:读入 invent.datfilename dst d:dst;data invent;infile dst(invent);input item $ 1-13 idnum $ 15-19 instock 21-22 backord 24-25;run;#注: l 当语句编译时,将输入的每个变量名加入pdv;l 一般变量属性如长度、类型等由第一次遇到这个变量时确定;l 如数据步中还有其它语句,这些语句涉及的变量名也会加入pdv,并由这些语句确定变量的类型和其它属性.l pdv 程序数据列_n_ _error_ item idnum instock backord1 0 . . l 在数据步的最后(指遇到run语句的时候),编译阶段完成并且新的sas数据集invent的描述部分也初步建成.描述部分包括: 数据集的名称 观测和变量的个数 变量的名称和属性 数据编译结束,上例数据集包含输入的4个变量; _n_ _error_并不写入数据集; 因没执行所以还没观测; 在执行过程中,每个原始数据记录经过处理由pdv写入数据集作为一条观测.执行阶段:当编译正确完成后,则开始执行。创建数据集的数据部分。l pdv的外部变量初始化为缺失值;l 输入源文件中每条纪录至输入缓冲器,按input语句读入pdv;l 按数据步的其它语句处理后存入pdv;l 在数据步结束时缺省地将pdv的内容作为一条纪录写入新的数据集;l 对源文件中每条记录都按上述步骤执行一次;l 当对源文件最后一条记录执行结束后,数据步执行完成。如上例运行流程l 执行之初, _n_=1 ,_error_0,其它变量置为缺失值:字符为空格,数值为句点;l 接着infile语句确定源数据文件的位置;l 当input语句从源数据记录读入数据值时,使用输入指针跟踪读入位置,开始输入指针指向第一条记录的第一列,除非另有设定.输入语句执行时,读入源数据的第1-13列并在pdv赋值给item.l _n_ _error_ item idnum instock backord1 0 Bird Feeder . . l 第一个字段读入后输入指针留在第14列.对按列或格式化模式输入,指针由输入语句命令其下一个指向或留在上次读入的最后位置的下一列l 下一步,读入15-19列的数值并在pdv中赋值给idnum.l 类似input语句从21-22读入instock数值,此时在数据步中有赋值语句或其它语句,就执行这些语句;l 在数据的最后,进行三个缺省的操作: pdv写入数据集的第一个观测; 控制返回数据步的开始; 将pdv中的输入变量的值置为缺失值,自动变量保留原有值.说明:l 在读入外部数据生成sas数据集时,系统在数据步迭代的开始时为每个变量置缺失值,但以下几种情况不受此限制: 在return语句中提到的变量; 在sun语句创建的变量; 在_temporary_中的数组元; 在file和infile语句的选项中创建的任何变量 自动变量。与此对照,当读入sas数据集时,系统只在数据步的第一次执行前将变量置为缺失值,以后变量保留其值直至新的值写入。如通过赋值语句或下一次执行set或merge语句更改变量的数值.在set或merge语句选项中创建的变量在逐次迭代中保留它的值数据步像个循环,一次次重复读入数据和创建观测。循环的每次称为一次迭代。在第二次迭代开始,_n_置为2,第二次执行input语句.至无新数据读入和写入数据集为止。数据值集中变量的次序决定它们在sas数据集中的缺省次序。其它模式读入的编译与执行编译与执行过程类似,只在输入指针的控制与读入长度方面需加一些说明。如:#data indt03;infile dst(imptdt03);input last name $7. 9 firstname $5. 15 jobtitle 3. 19 salary comma9.;run;#编译阶段,pdv中字符变量长度就是其输入格式规定的宽度。但数值变量jobtitle和salary缺省为8,不同于输入格式规定的3和8。因为sas在内部缺省的将数值存为8字节的浮点数(不论它含多少位数字),数值变量存储的长度不受输入格式规定的宽度和input语句中列数设定的影响。随这样,在input语句中中正确设定源数据读入宽度还是有必要,否则对所有数值变量输入都设为缺省宽度8,可能执行时将输入数据搞乱。如#data indt03;infile dst(imptdt03);input last name $7. 9 firstname $5. 15 jobtitle 8. 19 salary comma9.;run;#列举输入模式中,除非length语句加以设定,否则pdv中变量的长度都为缺省的8。读入的宽度由系统在扫
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 链条装配工客户满意度考核试卷及答案
- 房子转让协议书
- 租赁土地合同协议书
- 钛真空熔炼工知识盲区填补考核试卷及答案
- 锁具装配工资源协调与分配考核试卷及答案
- 电子绝缘材料上胶工安全技术规程
- 2025合同模板股权投资合作合同范本
- 2026届广东省云浮数学九年级第一学期期末复习检测试题含解析
- 《2025安徽省学校保卫劳动合同》
- 四川省绵阳市绵阳外国语学校2026届数学八上期末学业质量监测试题含解析
- 吉林省松原市四校2025~2026学年度下学期九年级第一次月考试卷 物理(含答案)
- 2025云南昆明元朔建设发展有限公司第一批收费员招聘20人考试参考试题及答案解析
- 破局向新 持续向上-2025年人力资源发展趋势报告-智联招聘北大国发院
- 仓库环境管理办法
- 2025年大模型章节练习考试题库
- 三年级数学《毫米的认识》教学设计
- 人工智能基础与应用课件 项目1 初探人工智能
- 2025-2030年中国智能电网行业市场发展前景及投资战略研究报告
- 微积分学-P.P.t-标准课件00-第1讲微积分的发展历程
- 导数的应用-函数的零点问题(5题型分类)-2025年高考数学一轮复习(解析版)
- 第十中学八年级上学期语文10月月考试卷(含答案)
评论
0/150
提交评论