SAS逻辑库中、由SAS创建和处理的SAS文件,是SAS存储数据的主要方式。SAS数据集包含以表的观测(行)和 变量(列)为形式存在的数据值,以及用以描述变量类型、长度和创建该数据集时所使用的引擎等信息的描述信息。根据其是否包含真正的数据值,SAS数据集可分为SAS数据文件和SAS视图。SAS数据文件包含 数据和描述信息,在逻辑库中的成员类型是DATA;而SAS视图不包含 数据值,是指向其他数据源的虚数据集,成员类型是VIEW。下面分别 介绍SAS数据集的文件内容、命名,各种SAS数据文件和SAS视图,以 及它们的创建方式。
1.数据集文件
下面来具体看看上图中的各个组件。
- ·描述信息:描述了SAS数据集自身及其变量的属性,包括观测数、 观测长度、该数据集上次的修改日期等其他信息。其变量的描述信息包 括名称、类型、长度、输入输出格式、标签,以及是否已经为该变量建 立索引等属性。
- ·数据值:以矩形表的形式排列。一个数据集可包含若干个观测(也称为行),每个观测通常由一个或多个变量(也称为列)值组成。
- ·索引:是单独的SAS文件,可以为SAS数据文件创建索引,以提供 对指定观测的直接访问。索引文件与其数据文件有着相同的名称,但成员类型为INDEX。索引可提供对指定观测更快的访问,尤其是对较大的数据集而言。
- ·扩展属性:是定义在数据集或变量之上的元数据。扩展属性使用DATASETS过程创建,表示为<名称-值>对。
SAS数据集为例,来理解数据集的描述信息、观测和变量。
在SAS窗口提交如下代码生成数据集:
libname saslib 'c:\sas\data';
data saslib.Inventory;
input Product_ID $ Instock Price;
datalines; P001R 12 125.00
P003T 34 40.00
P301M 23 500.00
PC02M 12 100.00
;
run;
使用CONTENTS过程打印数据集的属性信息,代码如下:
proc contents data=saslib.inventory;
run;
CONTENTS过程生成的结果如图2.3所示。其中包含了上面提到的 数据集信息、主机相关信息和变量信息等。
图2.3 数据集描述信息输出
提交PRINT过程代码,打印数据集信息。
proc print data=saslib.inventory noobs;
run;
上面代码打印的数据集如图2.4所示。
图2.4 数据集数据值
该数据集包含4个观测,每个观测表示一种产品的各类信息。这里 有3个变量:Product_ID、Instock和Price,分别表示产品编号、库存数和价格。其中P001R、12、125等均为数据值。
2.数据集命名
命名格式:
libref.SAS-data-set.membertype
共3个组成部分,从左到右依次为逻辑库引用名、数据集名称和成员类型。在引用数据集时,通常会指定前两个,SAS会根据上下文环境,例如该数据集出现的位置或数据集的自描述信息,来确定第三个。逻辑库 引用名是与SAS数据集所在物理位置相关联的SAS逻辑库名。当创建新 数据集时,逻辑库引用名表明要将该数据集保存在哪里(位置)。当引用SAS数据集时,逻辑库引用名会告诉SAS在哪个逻辑库中找到该数据 集。
数据集名称遵守的SAS命名规则如下:
- ·最大长度为32字符。
- ·必须以字母(从A~Z,大小写均可)或下划线(_)开始。
- ·可以是数字、字母和下划线(_)的任意组合。
成员类型由SAS指定,例如SAS数据文件的成员类型是DATA,SAS视图的成员类型是VIEW。(一般情况下不需要去使用)
3.变量属性
SAS数据集变量的属性包括变量名、类型、长度、输出格式(format)、输入格式(informat)和标签(label)。输出格式、输入格式和标签是变量的可选属性。
每个变量的变量名必须遵守的SAS命名规范如下:
- ·最大长度为32字节。
- ·必须以字母(从A~Z,大小写均可)或下划线(_)开始。
- ·可以是数字、字母和下划线(_)的任意组合。 变量的类型是字符型或数字型。字符型变量可包含任何值,而数字型变量只能包含数字值(数字0~9、=、-、点(.)和科学计数法的.)。
SAS以数字值存储日期和时间。默认情况下,SAS的日期值指从1960年1月1日开始的天数,SAS使用从凌晨开始的秒数存储时间值,datetime)指从1960年1月1日开始的秒数。该开始日期也可以通过系统变量YEARCUTOFF指定为其他值。
下面提交如下代码来生成数据集sales,并使用CONTETNS过程和PRINT过程分别打印该数据集的描述信息和数据值。
libname saslib 'c:\sas\data';
data saslib.sales;
infile datalines dsd missover;
input Emp_ID $ Dept $ Sales Date;
format Sales COMMA10. Date yymmdd10.;
informat Date date9.;
label Emp_ID="员工ID" Dept="部门" Sales="销售数据";
label Date="销售时间";
datalines;
ET001,TSG,$10000,01JAN2012
ED002,,$12000,01FEB2012
ET004,TSG,$5000,02MAR2012
EC002,CSG,$23000,01APR2012
ED004,QSG,,01AUG2012
;
run;
proc contents data=saslib.sales;
run;
proc print data=saslib.sales noobs label;
run;
如图2.5所示为CONTENTS过程打印的部分结果,表示该数据集的变量属性,其中,Date和Sales为数值型变量,Dept和Emp_ID为字符型 变量。如图2.6所示为PRINT过程的打印结果,可以看出,Dept(部门) 的缺失值为空格,Sales(销售数据)的缺失值为点(.)。
图2.5 变量属性
图2.6 打印数据集
格式(format)会影响数据值输出的方式。SAS提供了各种字符、数字和日期时间格式。例如,为了将23000显示为23000,必须使用w表示最大宽度,d为小数位数。比 如,在图2.5中,Date变量的输出格式为“YYMMDD10.”,打印时该变量 的形式则为YYYY-MM-DD(例如2012-01-01)。Sales的输出格式 为“COMMA10.”,对应的数据输出形式则为10000。还可以创建并存储自定义的格式,具体在后面介绍。
format var1 comma10;
输入格式(informat)指定数据值以特定的格式读入,从而成为标 准的SAS值。在读取包含字母或其他特殊字符的数字值时必须使用输入 格式。例如,需要把输入值“$23000”读取为数字型的变量,则必须使用 输入格式DOLLARw.d才能正确读入。自定义的格式也可以用作为输入格式。SAS提供了丰富的输入输出格式用于从外部文件读取各种日期格式 和显示各种日期格式,以满足对各种日期格式的需要。在上面的示例中使用输入格式“DATE9.”读入了“01JAN2012”形式的日期,输出时使用的是输出格式“YYMMDD10.”,从而将存储的数字显示为“2012-01-01”。
informat var1 comma10;
标签通常是描述该变量的文本,最大 长度为256个字符。默认情况下,报表以变量名来标识变量,但是可以 将一个标签分配给相应的变量来显示该变量的描述信息。上例中“员工编号”,Dept的标签为“部门”,Date的标签为“销 售时间”,Sales的标签为“销售数据”。在代码中可以看到PRINT过程使 用了LABEL选项,这样一来,打印的数据集表头将会使用各变量的标 签而不是变量名称。
label var1=name1 var2=name2;
4.SAS数据文件
SAS数据文件是一种在其文件中包含数据的数据集。
有两种类型的数据文件:原生SAS数据文件和接口SAS数据文件。
- SAS格式的文件,用来存储SAS格式的数据值和描述信 息(逻辑库是通过Base引擎定义的)。
- 接口数据文件是指数据以其他格式存在,并且SAS可以通过Oracle、DB2、Sybase、ERP系统中的数据文件。SAS通过SAS/ACCESS接口引擎来访问这些文件中的数据,并将这些文件当作SAS数据集处理(通过SAS/ACCESS 接口逻辑库定义的)。
使用DATA步创建SAS数据文件的语法如下:
DATA 数据集名称;
… SAS语句…;
RUN;
其中,SAS语句用于指定数据源。不同的数据源,SAS语句也不尽相同,常用的3中如下。
- DATELINES语句表示从程序语句中读取数据
- SET语句读 取指定的输入数据集
- INFILE语句读取指定的外部数据文件
5.SAS视图
SAS视图本身并不存储数据值,它仅包含描述信息和从其他SAS数据集或从存储为其他软件厂商文件格式的文件中获取数据所需要的信息。SAS视图的成员类型是VIEW。
可使用SQL过程、ACCESS过程或者DATA语句的VIEW选项来创建SAS视图。根据创建的方式,视图又分为SQL视图、接口SAS视图和DATA步视图。其中SQL视图和DATA步视图都称为原生视图, SAS/ACCESS视图称为接口视图。
创建DATA步视图的语法如下:
DATA 数据集名称/view=数据集名称;
… SAS语句…;
RUN;
与使用DATA步创建SAS数据文件一样,SAS语句根据数据来源的 不同会有所不同。在DATA步视图中可用的数据源可以是原始数据文 件、SAS数据文件、PROC SQL视图、SAS/ACCESS视图或其他数据库 管理系统中的数据文件。下面给出了一段创建DATA视图的示例代码, 数据源为SAS数据文件。
data saslib.invt_vw / view=saslib.invt_vw;
set saslib.inventory;
run;
上面代码创建了DATA步视图saslib.invt_vw,其数据来自于逻辑库saslib下的Inventory数据文件。
接口视图通过SAS/ACCESS创建,可读取第三方数据库管理系统(DBMS)的数据,例如DB2或Oracle。其实,SAS/ACCESS为这些第三方产品提供了LIBNAME引擎接口,对这些产品,建议使用LIBNAME和SAS/ACESS对应的引擎来指定SAS逻辑库到DBMS数据,这比使用ACCESS过程创建接口视图更容易,也更有效。 使用SAS视图有如下优点:
- ·可以节省磁盘空间,因为SAS视图不存储实际数据,仅仅存储去哪儿找到数据及数据如何格式化的指令。
- ·因为数据总是在执行时才从SAS视图中获取,这样能保证输入的数据集总是当前的。
- ·SAS视图可减少由于数据设计的改变对用户造成的影响。例如,可以改变存储在SAS视图里的查询信息而不必改变视图结果的特征。
- ·使用SAS/CONNECT软件,SAS视图可连接不同主机计算机上的SAS数据集,然后展示公司分布式数据的集成视图。
SAS视图可用于以下操作:输入其他DATA步或PROC步,将数据 迁移到SAS数据文件或SAS支持的数据库管理系统中,使用PROC SQL 与其他数据组合。
在选择使用SAS数据文件还是SAS视图时需要考虑以下方面:
- ·数据文件会使用额外的磁盘空间,而SAS视图会占用额外的处理时间。
- ·数据文件变量可在使用前排序和创建索引,而SAS视图在执行过程 中只能以其存在的形式处理数据。
6.特殊的数据集
还有一种特殊的数据集:_NULL_。如果想执行一个DATA步又不 想创建SAS数据集,可以指定关键字_NULL_作为数据集名称。代码如 下:
data _null_;
SAS会执行该DATA步里面的语句但不会创建新数据集,不会有观 测或变量写入任何数据集。如果一个DATA步的输出不需要存储为数据 集,比如绘制报表,这种处理可更有效地利用计算机资源。