SAS编程基础.doc
- 格式:doc
- 大小:329.52 KB
- 文档页数:7
第二章 SAS 编程基础第一节常量、变量与观测值2.1.1 观测值描述单一整体,如个别人、一个实验动物、一年、一个地区某些特性的一系列数据值称为观测值,又称观察。
2.1.2 变量给定特性的数据值的集合组成了变量。
在SAS数据集中,每一个观测值是由各个变量的数据值组成。
在数据集中每一列数据是一个变量。
1.命名SAS变量名和其他名称如数据集名等的命名规则都相同,它可以多至8个字符长,第一个字符必须是字母(A,B,C,….,Z),或者是下划线(_),后面的字符可以是数字或下划线。
空格不能出现在SAS名中,特殊字符(如$,@,#)也不允许在SAS名中使用。
SAS 系统保留了一定的名称作为特殊的变量名,这些名称以下划线开始和结尾。
如_N_和_ERROR_等。
2.变量特性SAS变量有两种类型,数值型和字符型。
字符型变量在名后用一“$”号来表示。
除了他们的类型外,S A S变量还有下列特性:长度、输入格式、输出格式和标记。
变量的长度特性,是指在SAS数据集中用以存储它的每一个值的字节数。
缺省长度是8(为了存储长度与缺省值不同的变量,需使用LENGTH语句)。
变量的特性,或者明确地说明,或者在它们首次出现时的上下文中给出定义。
例如:DATA A;C='BAD';PUT C;C='GOOD';PUT C;RUN;C在第一次出现时已被定义成字符型变量,长度为3,因此第二次再向c中赋值GOOD时,由于c已被定义成长度为3,故c中只存有‘GOO’。
PUT语句的作用是把变量的值输出到LOG窗口。
变量的其他特性将在后面逐渐介绍。
3.变量清单的简化表示在SAS程序中定义了完整的变量清单后,就可以在后面许多语句中使用缩写变量清单形式。
名称形式缩写意义形如:X1,X2,…Xn的带有序号的名称X1-Xn 从X1到Xn的所有变量形如 X P A * 的名称范围X-A 从X到A的所有变量X-NUMERIC-A 从X到A的所有数值变量X-CHARACTER-A 从X到A的所有字符变量特殊SAS名称_NUMERIC _ 所有数值变量_CHARACTER _ 所有字符变量_ALL _ 所有变量例如:INPUT NAME $ VARl VAR2 VAR3 VAR4 VAR5 VAR6;也可以写成:INPUT NAME $ VARl一VAR6;注意字符型变量NAME不包含在这个缩写清单中,有序号的变量不必全部列出,这些变量要求类型相同,或全是数值型的或全是字符型的。
第一章:DATA 步阐述DA TA 步是SAS 的一个关键步,正确理解其执行过程将会学习起来更方便。
1)DATA 步是一个循环,数据是一行一行地执行(与SQL 过程不同,它是对整个数据集进行操作);2)DA TA 步在执行时,将数据放在PDV 中,在这里将数据整理成想要的格式3)有三种情况可将PDV 中的数据输出到数据集中,OUTPUT 语句,return 语句,data 步结尾(;或run;)Output 语句:此语句出现在data 步中间时,将PDV 中数据输出到SAS 数据后,继续执行直到data 步结尾。
Return 语句:将pdv 中数据输出到SAS 数据集后,返回到data 步开头,执行下一次循环。
data 步结尾(;或run;):缺省形式,也是必须语句,否则DATA 步不完整。
相当于一个放在data 步结尾处的return 语句。
注:当一个DATA 步中含有OUTPUT 语句时,当执行到语句output 时才输出PDV 中的数据,data 步结尾处的默认输出不起作用。
4)退出SAS 数据步:stop 语句和abort 语句;其作用是退出DATA 步,并丢掉PDV 中的数据。
data aa; input ss pay; if _error_ then delete ; pi=constant('PI');/*常数pi*/ format pi 15.13; e=CONSTANT('e');/*常数e*/ datalines ; 111 100 aaa 200 444 300 run ; proc print ;run ;结果相同(只读取了第一条观测),左边在LOG 窗口显示一个提示,右边则显示一个出错信息注:abort<return|abend>,退出SaS 系统(与正常退出相同,有相关提示)。
5)DA TA 步的短路: IF expression ;(子集IF 语句):若表达式是假,系统立即返回到DATA 步开头,继续执行下一条观测,且不处理当前观测。
第三课 SAS编程–第一部分一.SAS 变量的定义/* 直接赋值 */data newvar;a1 = 100;a2 = 1.2e-5; /* 数值型变量的科学表达法 */b = 0100; /* 数值型变量前面的0不起作用 */c = ‘new’;d = “NEW”; /*字符型变量输入时是什么,值就是什么 */ f = “ NeW “;name1 = “Tom’s”;name2 = ‘Tom’’s’;date1 = ‘1jan2006’d; /* 直接定义日期 */ date2 = ‘01jan04’d;time1 = ‘9:25’t; /* 直接定义时间 */ time2 = ‘9:25:19’t;dtime = ‘18jan2003:9:27:05am’dt; /* 定义日期时间 */if begin=’01may04:9:30:00’dt then end=”31dec90:5:00:00”dt;run;proc print; run;/* 自定义变量 *//* 产生一个取值为 1 到 100 的变量 */data int;do i = 1 to 100; /* 此处 do …end 为循环语句, i 为循环指标,可取任何符号 */ a = i;output;end;run;proc print; run;/* 简洁版 */data int;do a = 1 to 100;output;end;run;proc print; run;/* 通过各种运算定义变量 */SAS 算子✧用于比较:= (EQ) 等于,^= (NE) 不等于,~= (NE) 不等于,>(GT)大于,<(LT)小于,>=(GE)大于等于,<=(LE)小于等于✧算数运算:+ 加法,- 减法,* 乘法,/ 除法,** 幂次✧逻辑运算: & (AND) 和,| (OR) 或,~ (NOT) 非,^ (NOT) 非/* 旅游数据 */data travel;input country $ nights aircost landcost vendor $;cards;France 8 793 575 MajorSpain 10 805 510 HispaniaIndia 10 . 489 RoyalPeru 7 722 590 Mundial;run;data newair;set travel;length remarks $ 30; /* remark 的值会很长。
第二章 SAS 编程基础第一节 SAS 逻辑库2.1.1 什么是SAS逻辑库SAS逻辑库是SAS系统对计算机文件夹或数据库系统的一个指向性逻辑标识,通过该标识,可以指向一个物理文件路径,或指向一个数据库实例。
常用的SAS逻辑库有sasuser、saswork、sashelp等。
2.1.2 创建(定义)SAS逻辑库LIBNAME 逻辑库名 <引擎> “物理路径”;语法解读:Libname:定义逻辑库命令逻辑库名:即给逻辑库起的名字,字符长度不超过8B。
引擎:可选项,如果连接数据库,就要给出连接的相应数据库的引擎名称。
物理路径:就是实际的文件夹文理路径。
例子:Libname testlib “c:\data\test”;Libname zhangsan “/home/user/data/”;Libname oradb oracle user=user1 password=xxx path=orcl;Libname mylib ACCESS “d:\student.mdb”;2.1.2 逻辑库的引用方法:逻辑库名.数据集名例:第二节常量、变量与观测值2.2.1 观测值描述单一整体,如个别人、一个实验动物、一年、一个地区某些特性的一系列数据值称为观测值,又称观察。
2.2.2 变量在SAS数据集中,每一个观测值是由各个变量的数据值组成,在数据集中每一列数据是一个变量。
1.命名SAS变量名和其他名称如数据集名等的命名规则都相同,它可以多至32个字符长,第一个字符必须是字母(A,B,C,….,Z),或者是下划线(_),后面的字符可以是数字或下划线。
空格不能出现在SAS名中,特殊字符(如$,@,#)也不允许在SAS名中使用。
SAS 系统保留了一定的名称作为特殊的变量名,这些名称以下划线开始和结尾。
如_N_和_ERROR_等。
2.变量特性SAS变量有两种类型,数值型和字符型。
字符型变量在名后用一“$”号来表示。
SAS编程基础-数据获取与数据集操作(1)1. 数据来源SAS数据来源主要有两种:⼀是通过input语句创建,另外⼀种⽅式是通过外部数据⽂件获取。
1.1 libname1.2 odbc1.3 passthrough1.4 import1.5 input该⽅式是在SAS系统下通过input语句输⼊SAS数据块,实践中是最不常的⽤的⼀块。
2. set语句从⼀个或者多个SAS数据集中读取观测值并实现纵向合并。
2.1 keep=选项data keep;set sashelp.class(keep = age sex);run;该⽅式创建了⼀个临时数据集keep(输出数据集),然后使⽤set语句从数据集sashelp.class中获取数据,keep=指定了读⼊的变量,其他冗余变量不读取,最后将读取的变量输⼊到数据集keep中。
还可以输出两个或者多个数据集:data d1(keep=name)d2(keep=name sex);set sashelp.class(keep=name sex);run;输出数据集d1和d2,并且分别在每个数据集后使⽤keep=指定了输出的变量。
在set语句中使⽤keep=语句,可以提⾼运⾏效率,因为它使得set语句从数据集class中只读取了name和sex两个变量到PDV中。
去掉这⾥的keep=不会报错,但是效率会降低。
进⼀步,如果将这⾥的keep修改为“keep=name”,即去掉sex,那么导致的结果是数据集d2中只包含name变量,⽽不包含sex变量,这是因为set语句没有读取sex 变量,⾃然不会输出到d2中。
2.2 rename=选项将变量名重新命名:data rename;set sashelp.class(keep = name sex rename=(name=name_new sex=sex_new));run;对重命名变量需要⽤括号括起来。
2.3 where表达式添加筛选条件:data where;set sashelp.class(keep=name sex where=(sex='男'));run;读取性别为男的⼈的姓名和性别。
SAS编程基础2007-06-19 00:32同其它计算机语言一样,SAS语言也有它自己的语汇和句法:关键词和连结关键词与其它辅助信息的规则。
用户使用SAS语言来定义数据和规定对数据怎样做统计分析的问题。
由SAS语句组成的序列称为SAS程序。
1 SAS语句一 SAS语句的定义我们先来看一个实例:某小学10名9岁男生3个项目智力测验得分资料如下,试计算这10名男生各项目的平均得分。
圆括号( )、单引号‘ ‘、双引号“ “、美圆符号$、列指针控制符@、行指针控制符#、冒号:、句号.、分号;等;运算符包括:加号+、减号—、乘号*、除号/、乘方**等;等号=、不等号^=、小于号<、大于号>、小于等于号<=、大于等于号>=等。
三语句格式SAS语句的基本格式是:KEYWORD Parameter … [item | item | item ] options;关键词参数选项1 选项2 选项3 选择值关键词:用以说明语句类型和功能的单词;参数:要求用户提供的信息。
不用括号,不是任选项。
例如:input x y z;其中:input 是关键词,它说明要把数据提供给哪些变量。
后面跟的变量名x、y、z 都是参数,即要求用户提供的信息。
…表示参数可以不止一个。
[选项1 | 选项2 | 选项3 ]中的竖线|用来分隔各选择项,表示其中任选一个;方括号内的信息是可以选择的。
例如:proc means data=store maxdec=3;其中:proc是语句的关键词,它说明本语句是过程语句;means 是过程名,它说明要调用的过程名称;data=、maxdec=都是选项的关键词,等号后面是用户提供的信息。
2 SAS程序一系列SAS语句组成一段SAS程序。
SAS程序中的语句可分为两类步骤:DATA步和PROC步。
这两类步骤是所有SAS程序的模块。
通常用DATA步产生SAS数集而用PROC步对SAS数据集内的数据进行分析处理并输出结果。
DA TA是一个循环,循环的退出(STOP,丢掉当前PDV中的数据)与短路(STOP,ABORT,RETURN)数据步中的PDV数据指针和程序数据矢量(PDV)控制数据指针的变量2.3 SAS变量变量命名规则变量的属性:变量的类型字符型:缺失值为空,但仍占1字节的位置数值型:缺失值为“.”,变量的长度字符型:3-8,缺省值8数值型:1-32767字节,依输入时的字符长度而定。
输入/输出格式标签最多256字节,命名规则同数据集相同变量列表变量按照它们在PDV中出现的顺序被定义,数据集操作常用语句:DA TA/SET/BY/MERGE/UPDA TE/MODIFY/PUT/FILE/INFILE3.1 数据获取二种方式:直接方式(在SAS系统中用INPUT语句来创建)间接方式(直接获取外部数据:PC格式(如TXT,EXCEL等文件);数据库格式(如DB2,TREADA TA等)1 直接访问外部数据库访问SPSS数据库libname sps spss'F:\Data_Model\Book_data\chapt3';访问DB2数据库libname hsdb db2 user= xxxx password="xxxx" datasrc=datadb;访问Oracle数据库libname oralib oracle user = xxx pw = xxx path = dbmssrv schema = educ;访问TERADA TA数据库libname p_cac_t teradata user=xxx password=xxx database=p_cac_t tdpid="caracal" override_resp_len=yes dbcommit=0;2 通过ODBC访问Step1(window中完成): 控制面板/管理工具/ODBC数据源/用户DSN/ACCESS选项(例如)/添加/扩展名为MDB,完成/数据源名(自定义),选择ACCESS数据库(扩展名为mdb)/确定完成Step2(在SAS中完成): libname odb odbc user=*** password=*** datasrc=test;3.1.3 IMPORT方式可用实例演示,并保住代码3.1.3INPUT方式自由格式,列表方式,格式化方式,命名方式(形式复杂,但实际中使用较少)3.2 SET语句1一般描述keepdata keep;set sashelp.class(keep=name sex);run;data d1(keep=name) d2(keep=name sex);/*这是定义处使用*/set sashelp.class(keep=name sex);/*这是调用处使用*/run;renamedata rename;set sashelp.class(keep=name sex rename=(name=name_new sex=sex_new)); run;wheredata where;set sashelp.class(keep=sex where=(sex='M'));run;In的使用data one;input x y$ @@;cards;1 a2 b3 c;data two;input x z$ @@;cards;4 d5 e;data in1;set one(in=ina) two(in=inb);in_one=ina;in_two=inb;run;firstobs obsdata obs;set sashelp.class(firstobs=3 obs=5);run;nobsdata nobs1(keep=total);set sashelp.class nobs=total_obs;total=total_obs;output;stop;/*停止DATA步,相当于退出DATA步的自循环*/run;注:程序在编译时就将数据集class头文件里面的观测数已读入并赋给变量total_obs。
SAS 软件与统计应用实验实验 2 SAS编程基础SAS 语言和其它计算机语言一样,也有其专有的词汇(即关键字)和语法。
关键字、名字、特殊字符和运算符等按照语法规则排列组成SAS 语句,一个SAS 程序由若干数据步、过程步组合而成,而每一个程序步通常由若干语句构成。
SAS 程序是在Editor 窗口中进行编辑,提交运行后可以在Log 窗口中显示有关信息和提示,在Output 窗口显示运行的结果。
2.1实验目的通过实验了解 SAS 编程的基本概念,掌握 SAS 编程的基本方法,掌握 SAS 数据步对数据集的管理和对数据的预处理。
2.2实验内容一、建立逻辑库与数据集,包括逻辑库的建立、直接输入数据建立数据集与读取外部数据文件建立数据集。
二、数据文件的编辑与整理,包括数据集的横向合并与纵向合并、数据集内容的复制、变量的增加与筛选、数据集的拆分和数据的排序。
2.3实验指导一、建立逻辑库与数据集1. 建立逻辑库【实验 2-1】编程建立逻辑库。
(1) 首先在 D 盘创建一个文件夹,如D:\SAS_SHYAN\SAS 数据集。
(2)建立逻辑库 mylib ,编辑并运行下面程序语句即可。
libname mylib "D:\sas_shiyan\sas 数据集 ";2.直接输入数据建立数据集【实验 2-2】将表 2-1(sy2_2.xls) 中的数据直接输入建立数据集 sy2_2,并将其存入逻辑库 mylib 中。
表 2-1职工工资编号姓名性别工作日期职称部门基本工资工龄工资奖金扣款实发工资3003王以平男1992-8-1助工生产6203005000142013004 林红女1993-8-1 助工供销620 280 500 200 12003005 吕兴良男1982-1-30 工程师技术1100 500 500 100 20003006 司马宇男1971-2-17 工人生产520 720 500 0 17403007 张学武男1967-10-9 工人保卫520 800 500 200 16203008 冯玉霞女1987-8-1 工程师生产1100 400 500 250 17503009 赵大强男1968-5-10 工人财务520 780 500 0 18003010 王萍女1987-8-1 工程师技术1100 400 500 100 1900代码如下:data mylib.sy2_2;length gzrq $ 10;input bh $ xm $ xb $ gzrq $ zc $ bm $ jbgz glgz jj kk sfgz;label bh=' 编号 ' xm=' 姓名 ' xb=' 性别 ' gzrq=' 工作日期 ' zc=' 职称 ' bm=' 部门 'jbgz=' 基本工资 ' glgz=' 工龄工资 ' jj=' 奖金 ' kk=' 扣款 ' sfgz=' 实发工资 ';cards;3003 王以平男 1992-8-1 助工生产620 300 500 0 14203004 林红女 1993-8-1 助工供销620 280 500 200 12003005 吕兴良男 1982-1-30 工程师技术1100 500 500 100 20003006 司马宇男 1971-2-17 工人生产520 720 500 0 17403007 张学武男 1967-10-9 工人保卫520 800 500 200 16203008 冯玉霞女 1987-8-1 工程师生产1100 400 500 250 17503009 赵大强男 1968-5-10 工人财务520 780 500 0 18003010 王萍女 1987-8-1 工程师技术1100 400 500 100 1900;RUN;运行完成后,在逻辑库mylib 中双击数据集名sy2_2,可以查看结果如图2-1 所示:图2-1 数据集 mylib.sy2_2说明:(1) SAS变量的基本类型有两种:数值型和字符型。
数值型变量在数据集中的存贮一般使用 8 个字节。
SAS 的字符型变量缺省的长度是8 个英文字符,可以使用LENGTH语句指定变量长度,LENGTH语句一般应出现在定义变量的Input 语句之前,格式为:LENGTH 字符型变量名$长度;如:LENGTH gzrq $ 10;(2)语句:2label bh = '编号 ' xm = '姓名 ' xb = '性别 ' gzrq = ' 工作日期 ' zc = ' 职称 ' bm = '部门 ' jbgz = ' 基本工资 ' glgz = ' 工龄工资 ' jj = '奖金 ' kk = '扣款 ' sfgz = ' 实发工资 ';为每个变量加标签。
(3)数据块中数据之间可以用空格隔开,也可以使用Tab 键。
3.读取外部数据文件建立数据集【实验 2-3】读取文本文件sy2_3.txt (图 2-2)建立数据集work.sy2_3 。
假设文本文件存放在文件夹“原始数据”中。
图2-2 文本文件 sy2_3.txt代码如下:data sy2_3;infile原始数据 \sy2_3.txt';input bh$ xm $ xb$@@;length gzrq$ 10;input gzrq$ zc $ bm $ jbgz glgz jj kk sfgz;run;注意:文本文件中数据之间用空格隔开,不能使用Tab 键。
运行完成后,在临时库work 中双击数据集名 sy2_3 ,可以查看结果如图2-3 所示:图 2-3数据集sy2_3【实验 2-4】读取 Excel 文件 sy2_2.xls(如表 2-1 所示)建立数据集work.sy2_4 。
已知 Excel 文件 sy2_2.xls 存放在文件夹“原始数据”中。
首先将表2-1 修改为如图2-4 所示的 Excel 表 sy2_4.xls, 并存放在原始数据中。
3图2-4 Excel 表 sy2_4.xls建立数据集work.sy2_4 代码如下:proc import out=sy2_4datafile =原始数据\sy2_4.xls"dbms = excel2000 replace;getnames = no;/*如果表中第一行为变量名,则删去此行*/run;注意: sy2_4.xls 中第 3 至 5 列中的多加的“0”是为了保证导入后字符型变量的长度正确。
二、数据文件的编辑与整理1.数据集的复制与修改【实验 2-5】将 mylib.sy2_2 中的“工作日期”去掉,基本工资小于600 的改为 600,生成新的数据集work.sy2_5 。
代码如下:data sy2_5;set mylib.sy2_2;drop gzrq;if jbgz< 600 then jbgz= 600;run;2.增加新变量【实验 2-6】在 mylib.sy2_2 中增加变量 yfgz(应发工资 =基本工资 +工龄工资 +奖金)、生成新的数据集 work.sy2_6 。
代码如下:data sy2_6;set mylib.sy2_2;yfgz = jbgz + glgz + jj;run;3.数据集的纵向拆分【实验 2-7】按基本工资是否大于600 将 mylib.sy2_2 拆分成两个新数据集work.sy2_7_1 和work.sy2_7_2 。
代码如下:data sy2_7_1 sy2_7_2;4set mylib.sy2_2;select;when (jbgz<600) output sy2_7_1;when (jbgz>=600) output sy2_7_2;end;run;4.数据集的纵向合并【实验 2-8】将上述拆分后的两个数据集纵向合并恢复原样,产生新的数据集work.sy2_8 。
代码如下:data sy2_8;set sy2_7_1 sy2_7_2;run;5.数据集的横向合并【实验2-9】将 mylib.sy2_2 中职称为“工人”的观测拆分成一个仅含编号、姓名和基本工资,一个仅含有编号和实发工资的两个新数据集work.sy2_9_1和work.sy2_9_2。
然后将work.sy2_9_1 和 work.sy2_9_2 合并成一个新数据集sy2_9。
(1)提取职称为“工人”的观测:data sy2_9_0;set mylib.sy2_2;if (zc = '工人 ');run;(2)建立两个数据集:data sy2_9_1;set sy2_9_0;keep bh xm jbgz;run;data sy2_9_2;set sy2_9_0;keep bh sfgz;run;(3)横向合并:data sy2_9;merge sy2_9_1 sy2_9_2;by bh;run;proc print; run;/* 列表显示数据集sy2_9*/6.数据的排序【实验 2-10】将 mylib.sy2_2 按 jbgz 升序、 sfgz 降序排序后生成新的数据集work.sy2_10 。
代码如下:5proc sort data=mylib.sy2_2 out = sy2_10;by jbgz descending sfgz;run;proc print data= sy2_10; /* 列表显示数据集 sy2_10*/ run;说明:在对两个数据集横向合并时,为了避免因两个数据集观测顺序不同造成混乱,一般应将两个数据集分别按同一个变量( BY 变量)排序后再合并,如【实验 2-9】中的横向合并可写成:Proc sort data = sy2_9_1;by bh;Proc sort data = sy2_9_2;by bh;run;data sy2_9;merge sy2_9_1 sy2_9_2;by bh;run;proc print; run;7.数据的列表显示【实验 2-11】列出数据集mylib.sy2_2 中所有男性职工的编号、姓名、部门、基本工资。
代码如下:Proc print data= mylib.sy2_2 label;var bh xm bm jbgz;label bh = ' 编号 ' xm = '姓名 ' bm = '部门 ' jigz = '基本工资 '; where xb= '男 ';run;2.4 上机演练【练习 2-1】表 2-2( lx2_1.xls )为某邮购服务部的部分顾客记录,编程进行如下操作:表 2-2 邮购服务部部分顾客记录姓名性别地区日期金额章文男华东1996-3-20 1099王国铭男华东1996-5-19 39童子敏女华北1996-1-5 986刘念新男东北1997-10-1 3581李思今女华北1997-4-4 659关昭女东北1996-11-5 358赵霞女东北1998-9-6 20106SAS 软件与统计应用实验(1)建立自己的逻辑库 (以自己名字的拼音命名 );(2)用数据步把此数据输入到SAS 数据集并存放在自己的逻辑库中;(3)列表显示男性顾客购买金额超过1000 的那些人;(4)按金额降序排序并输出结果;(5)把数据拆分为包含姓名、性别、地区的一个数据集和包含姓名、日期、金额的一个数据集;(6)用 MERGE 和 BY 合并上一步拆开的两个数据集。