2.3 逻辑库与数据集
SAS从导入数据到完成统计分析报告,这中间涉及很多重要的基本概念,如数据集、DATA步,PROC步等。接下来,我们就顺着这个流程,把最基本、最重要的概念捋一遍,那就从逻辑库和数据集开始吧。
→2.3.1 逻辑库
从上一小节SAS数据分析流程里我们知道,要进行数据分析,需要我们先把外部的Windows数据文件,比如CSV文件转成SAS可以直接识别和处理的SAS数据集,而SAS数据集则必须置于SAS逻辑库(SAS Library)中。数据存储在数据集里,数据集存放在逻辑库中,数据、数据集和逻辑库的关系就如同数据页、文件夹和抽屉的关系(见图2-3)。
图2-3 数据、数据集以及逻辑库的关系
在Windows环境下,SAS逻辑库其实是映射到一个(当然,也可以是多个)文件夹的名字。SAS会按照某些约定的格式去读写SAS逻辑库中的SAS数据集,这些约定的格式,被称为引擎(Engine),如SAS 9.4默认的引擎就是V9,SAS 9.4会用V9这种格式去生成SAS数据集、读取数据集。此外,SAS还可以用其他引擎读取外部数据,如可以用XLSX引擎读取Excel文件,SPSS引擎读取SPSS数据等(见图2-4)。
图2-4 SAS永久库的建立以及引擎
大多数情况下,我们都希望处理好的SAS数据集能够保存在某个文件夹下,以备后用,而对于一些中间数据或者临时数据,我们则希望关掉SAS后它们就被自动删除。因此,SAS给我们分别提供了永久逻辑库和临时逻辑库(见图2-5)。永久库除了有SAS自带的Maps、Mapsgfk、Mapssas、Sashelp以及Sasuser外,我们也可以自建存放自己数据集的永久库,而临时库在SAS里就一个,名为Work库。我们在Work库里倒腾数据时很可能产生了一大堆中间数据集,最后把倒腾好的最终数据集存入永久库即可,关掉SAS软件后,那些留在Work库里的中间数据集不用我们去操心,会被自动删除。
图2-5 永久逻辑库与临时逻辑库
例如,我们想在D:\03 Writting\01 SAS编程演义\02 Data\Clean的位置建立一个永久逻辑库,取名为“Demo”。一种方法是采用工具按钮如图2-4所示方法生成;另一种方法则是通过LIBNAME语句生成。基本格式就是:LIBANME数据库名称 “数据库物理地址”,具体可见程序2-1利用LIBNAME语句自建永久逻辑库。
程序2-1 利用LIBNAME语句自建永久逻辑库
*===带*号的行是注释行===; *===自建永久库===; *===取名Demo,地址:D:\03 Writting\01 SAS编程演义\02 Data\Clean; libname demo "D:\03 Writting\01 SAS编程演义\02 Data\Clean";
需要留意的是,通过工具按钮建立永久库时,可以在建立时勾上“Enable at startup”,下次启动时SAS就会自动加载这个永久库,而通过LIBANME语句自建的永久库在SAS重新启动时,需要重新运行LIBNAME语句才可以重新把永久库的名字和物理地址关联上,然后才能在SAS Libraries里看到。如果想要让SAS语句建立的永久库在启动后就能看到,可以把包含LIBNAME语句的程序命名为autoexec.sas,并放入和sas.exe同级的目录中,此后每次SAS启动时会自动运行autoexec.sas程序,建立永久逻辑库。
→2.3.2 数据集
SAS数据集有两种:一种是SAS数据文件(SAS Data File);另一种是SAS视图(SAS View)。数据文件和视图用SAS打开后都类似于一张表格,不同的是数据文件是真实存在的数据,而视图是运行查询语句后动态生成的数据,两者的图标在DMS中也不一样,如图2-6所示。不过两者在实际内容效果方面却是一样的,如图2-7所示。由此而带来的疑惑是:既然两者的实际内容效果一样,有了数据文件为何还需要视图?谨记:视图是依据查询语句动态生成,因此视图本身几乎是不占存储空间的,利用视图可以节约硬盘空间。
图2-6 SAS数据文件与视图图标
图2-7 SAS数据文件与视图内容
SAS数据集的组成成分,在逻辑上可能仅有描述信息(数据视图时的情况),也可能是包含描述信息、数据值(数据文件时的情况)以及可能的索引和其他扩展属性四部分,具体见表2-1。单就数据集的描述信息来说,包括两部分:一部分是数据集概要信息,如数据集类型、创建引擎、创建时间等;另一部分是变量信息,如变量名称、类型、长度以及格式等。至于数据值,也即如图2-7所示的内容,是由行、列组成的表。行和列在SAS数据集里分别称为观测(observation)和变量(variable),这部分内容是数据文件独有的,SAS视图只有打开运行时才生成。
表2-1 数据集逻辑构成示意
如果希望查看数据集的描述信息,特别是如图2-8所示的第三部分内容:变量列表及其属性,则可以通过PROC CONTENTS实现,并且可以进一步加工整理成数据库的变量字典,极大地方便后续的工作。当然,也可以通过右击数据集,通过「查看列」来查看变量信息(见图2-9)。
图2-8 SAS数据文件描述信息
图2-9 右击数据集查看变量信息
欲查看数据值,可以通过PROC PRINT实现,当然,双击数据集也可以。不过在实际操作中,我们不会总是这样查看所有数据值,而是希望通过统计过程查看一些统计信息,如均数、分位数、分布图等。
由于数据集都在逻辑库下,因此在程序中指定数据集时,需要按照「逻辑库.数据集」的二级命名格式来明确告知是哪个逻辑库下的哪个数据集,中间用英文的句号隔开,当逻辑库为临时库WORK时,可以省略掉一级命名结构和句号「逻辑库.」。
程序2-2 查看数据集描述信息与数据值
*====查看逻辑库Demo里的数据集描述信息; *===查看数据文件的描述信息; proc contentsdata=demo.class_datafile; run; *===查看数据文件的数据值; proc printdata=demo.class_datafile; run; *===查看视图的描述信息; proc contentsdata=demo.class_view; run; *===查看视图的数据值; proc printdata=demo.class_view; run;
查看数据集的信息是学会了,但是如何创建数据文件呢?回顾图2-2,我们知道有两种方式:导入外部数据或者读取既有的SAS数据集。导入外部数据,我们既可以用DATA步,也可以用PROC步,具体情况将在第3章做详细介绍。读取既有数据集,我们可以用DATA步的SET语句,这里我们简单举例,把SAShelp库的Class数据集读取到我们自建的永久库Demo里和临时库WORK里,并都命名为class_datafile。
程序2-3 SET语句建立数据文件
*===自建永久库; libname demo "D:\03 Writting\01 SAS编程演义\02 Data\Clean"; *===建永久数据集,demo.不可省略; datademo.class_datafile; set sashelp.class; run; *===建临时数据集,work.被省略; data class_datafile; set sashelp.class; run;
建立数据文件学会了,如何建立视图呢?有两种方法:DATA步的VIEW选项和PROC SQL的Create view语句。
程序2-4 创建SAS视图
*===建视图; *===from data step; datademo.class_view/view=demo.class_view; set sashelp.class; run; *===from Proc sql; proc sql; create view demo.class_view as select * from sashelp.class; quit;
→2.3.3 变量
数据集中最为重要的一个概念莫过于变量(variable)。在SAS里,我们可以将变量简单理解为存储数字或者字符的容器,一个变量就是一列。变量有其属性,包括名称、类型、长度、输入格式、输出格式、标签、观测中的位置以及索引类型等。图2-9展示了变量的属性信息。
变量名有其命名规则,后面会详细介绍。同其他编程语言或者统计软件不同的是,SAS的变量类型非常简约,只有两种:数字和字符。数字型变量存储浮点数,包括日期和时间(在SAS里,日期实际存储的是距离1960年1月1日的天数,而时间实际存储的是距离凌晨的秒数,具体可见程序2-5);字符型变量存储的是拉丁字母、0~9阿拉伯数字以及其他特殊字符,默认长度是8个字节。输入/输出格式是SAS读取或者显示变量的规则,数字型变量默认输入格式是「w.d」,输出格式是「BEST12.」;字符型默认输入、输出格式均为「$w.」。关于格式,我们将在第7章做详细介绍。
程序2-5 SAS日期、时间以及日期时间的本质
datatmp; date="01Jan1960"d; time="00:00:00"t; datetime="01Jan1960 00:00:00"dt; run;