《深入解析sas:数据处理、分析优化与商业应用》一2.1 SAS编程基本概念

简介:

本节书摘来自华章出版社《深入解析sas:数据处理、分析优化与商业应用》一书中的第2章,第2.1节,作者 夏坤庄 徐唯 潘红莲 林建伟,更多章节内容可以访问云栖社区“华章计算机”公众号查看

2.1 SAS编程基本概念

在SAS系统中,SAS程序是用来获取外部数据、处理和管理数据,并对其进行分析预测和优化,从而生成信息报告的重要工具。在学习开发SAS程序之前,首先需要理解两个基本概念:SAS数据集和逻辑库,包括它们的命名、引用、类别等;然后得了解SAS中会经常使用的系统选项,这些系统选项让SAS的分析处理功能既灵活又强大。

2.1.1 SAS逻辑库

SAS逻辑库是一个或多个SAS文件的集合,用于组织、查找和管理SAS文件。SAS逻辑库管理的SAS文件包括SAS数据集、SAS目录、已编译的SAS程序,以及多维数据库文件等。在Windows和UNIX环境中,SAS逻辑库通常是包含在同一个文件夹或目录下的一组SAS文件,其他文件也可以存储在该文件夹或目录下,但只有具有SAS文件扩展名的那些文件会被认为是该SAS逻辑库的一部分。在其他操作系统下,SAS逻辑库有不同的实现方式,但通常都对应于当前操作系统用来访问和存储文件的组织级别。例如在z/OS(OS/390)操作系统下,SAS逻辑库是只能存储SAS文件的特殊格式化了的主机数据集。尽管实现方式不一样,但在SAS支持的各种操作系统下,SAS逻辑库的使用方式是相同的。
还有一种SAS逻辑库,叫作元数据边界逻辑库(metadata-bound library),是绑定在由元数据提供安全访问控制的对应表对象上的物理逻辑库。元数据边界逻辑库里的每个物理表都有指向特定元数据对象的信息,同时还创建了物理表和元数据对象之间的安全性绑定。该绑定保证了用户在访问该物理表时,SAS强制执行元数据层权限要求,从而避免从操作系统直接访问该物理表导致的安全问题。这种SAS逻辑库在SAS智能分析平台中可用,在本章不作介绍。
1.?逻辑库关联
可以通过LIBNAME语句、LIBNAME函数、使用“新建逻辑库”窗口或操作环境命令来定义逻辑库,并将SAS逻辑库与对应的逻辑库引用名关联起来。之后便可以通过该逻辑库引用名来读取、写入并更新SAS逻辑库中的SAS文件。使用LIBNAME语句定义SAS逻辑库的简化语法如下:
LIBNAME 逻辑库引用名 <逻辑库引擎> '逻辑库物理位置';
(1)逻辑库引用名
在定义SAS逻辑库时需要指定逻辑库引用名,临时逻辑库WORK除外。SAS逻辑库引用名的命名规范如下:
最大长度是8个字符。
必须以字母(从A~Z,大小写均可)或下划线(_)开始。
可以是数字(0~9)、字母和下划线(_)的任意组合。
例如,下面的SAS语句定义了SAS逻辑库,其引用名为saslib。

libname saslib base 'c:\sas\data';

SAS逻辑库与SAS逻辑库引用名是两个比较容易混淆的概念。SAS逻辑库是SAS文件的集合,SAS文件是其组成部分;而SAS逻辑库引用名是我们定义逻辑库时赋予这个逻辑库的引用名,并且在以后可以通过该逻辑库引用名来访问逻辑库中的SAS文件。永久逻辑库(即其中的SAS文件)会一直存在,而通常SAS逻辑库引用名仅在当前SAS会话中有效,除非使用“新建逻辑库”窗口指定逻辑库时勾选了“启动时启用”选项。永久逻辑库和“新建逻辑库”窗口,在后面都有介绍。
(2)逻辑库引擎
SAS逻辑库引擎是SAS软件和SAS逻辑库之间的接口软件组件,每个SAS逻辑库都关联一种逻辑库引擎。逻辑库引擎识别逻辑库中的文件并以SAS可理解的格式将文件内容呈现给SAS。SAS提供多种引擎以管理多个格式的数据。通过这些引擎SAS可以进行如下操作:存储和访问磁盘文件,将数据从物理位置放入内存中,读取其他软件产生的数据库文件,以及在不同操作系统之间迁移SAS文件等。
逻辑库引擎可分为原生逻辑库引擎和接口逻辑库引擎。原生逻辑库引擎也就是默认的Base引擎,访问由SAS创建和处理的SAS文件。在创建新逻辑库时如果不指定引擎,SAS会自动选择Base SAS引擎。该引擎根据自身版本的不同,可处理SAS 7、SAS 8和SAS 9文件,这些文件对应的版本引擎名称分别为V7、V8和V9。大多数情况下,SAS 9可以直接处理SAS 8、SAS 7和SAS 6创建的SAS文件,不需要对其进行转换。关于版本兼容性可能存在的问题及对应解决方法,可参考SAS帮助文档学习。
接口逻辑库引擎用来访问由其他软件系统(例如关系型数据库系统、ERP系统等)管理的数据。接口逻辑库对用户不透明,需要显式指定引擎名称,并且需要相应的SAS/ACCESS软件许可,而且通常还需要安装相应的数据库管理系统的客户端软件。例如要访问Teradata数据库管理系统中的数据文件,要有SAS/ACCESS to Teradata Interface的许可,并且在定义逻辑库时,LIBNAME语句中要指定对应的逻辑库引擎为Teradata数据库对应的引擎,同时还要安装了Teradata提供的客户端软件。
下面给出了定义原生逻辑库和接口逻辑库示例。
Base引擎相关代码如下(语句中base选项可省略):

libname saslib base 'c:\sas\data';

SAS/ACCESS to Teradata引擎相关代码如下:

libname tdlib teradata server=tera2650 user=user1 password=password1 database=hps;

(3)逻辑库物理位置
SAS逻辑库物理位置是一个或多个操作系统能够识别的物理位置,或者是一个或多个已经定义了的其他SAS逻辑库。在上面给出的Base引擎示例中,逻辑库saslib的物理路径为c:sasdata。对于连接到数据库管理系统的SAS逻辑库,通常是通过一系列数据库连接选项指定要访问的数据库管理系统的信息。如在SAS/ACCESS to Teradata引擎示例中,通过数据库连接选项分别指定了Teradata数据库服务器的名称、使用的用户名、密码及数据库名称。
SAS逻辑库还可以有多个物理位置。下面的代码示例给出了定义多个物理位置的SAS逻辑库Y2014。这3段代码都能实现将逻辑库引用名Y2014与4个物理位置c:sasdataquater1、c:sasdataquater2、c:sasdataquater3和c:sasdataquater4相关联。
代码1:

libname Y2014 ('c:\sas\data\quater1' 'c:\sas\data\quater2' 
'c:\sas\data\quater3' 'c:\sas\data\quater4');

代码2:

libname Q1_2004 'c:\sas\data\quater1';
libname Q2_2004 'c:\sas\data\quater2';
libname Q3_2004 'c:\sas\data\quater3';
libname Q4_2004 'c:\sas\data\quater4';
libname Y2014 (Q1_2014 Q2_2014 Q3_2014 Q4_2014);

代码3:

libname Q2_2004 'c:\sas\data\quater2';
libname Q3_2004 'c:\sas\data\quater3';
libname Q4_2004 'c:\sas\data\quater4';
libname Y2014 ('c:\sas\data\quater1' Q2_2014 Q3_2014 Q4_2014);

当一个物理位置下的空间不够时,定义多个物理位置的SAS逻辑库非常有用。这样,在写程序时只需要使用一个SAS逻辑库引用名,当前面的物理路径空间用尽时,SAS会自动将写入的SAS文件存储到其他物理路径。
2.?永久和临时SAS逻辑库
SAS逻辑库通常为永久数据库。永久SAS逻辑库存储在计算机的固定存储介质上,当SAS会话终止时不会被删除,其中的SAS文件可以在后续的SAS会话中继续使用。当使用永久SAS逻辑库中的文件时,通常需要指定逻辑库引用名作为两层SAS文件名的第一部分,并且要告诉SAS该文件的存储位置,例如saslib.Inventory,表明读取或写入SAS逻辑库saslib中的Inventory文件、数据集或目录(Catalog)等,至于Inventory具体指的是哪种SAS文件,与所使用的上下文环境有关。
同时SAS还提供了一种在SAS会话或作业运行过程中存储临时数据和文件的临时逻辑库,其引用名为WORK。逻辑库WORK不需要显式指定,且仅在当前SAS会话或作业执行过程中存在。逻辑库WORK中的文件在该SAS会话期间可用于任何DATA步或SAS过程,但如果SAS会话正常结束,WORK库中的文件在SAS会话结束时会被自动删除。一般情况下,可以通过指定一级名称来读写这个逻辑库中的SAS文件,同样也可以使用二级名称。例如,要引用临时逻辑库中的SAS文件Inventory,直接使用Inventory和使用work. Inventory的效果一样。
在开发SAS程序时,如果一次分析包含多个PROC步,通常会将前一个PROC步产生的中间数据或文件放入临时逻辑库中,供后面的分析过程使用。在分析完成时,这些中间数据或文件会自动清除。当然,良好的开发风格应该是在完成任务后,通过代码显式地删除所产生的临时数据。
3.?SAS系统逻辑库
SAS提供了4个特殊的系统逻辑库:WORK、user、sashelp和sasuser。WORK是临时逻辑库,前面已经介绍过,其他3个都是永久逻辑库。
user逻辑库可以使用LIBNAME语句、LIBNAME函数、系统选项USER=或操作系统显式指定。指定user逻辑库后,可以使用一级名称读取该逻辑库中的文件,就像引用临时逻辑库中的文件一样。一旦定义了SAS逻辑库 user,在SAS程序中使用一级名称读取或写入任何SAS文件时,SAS都会在该user逻辑库对应的物理位置查找或写入相应的SAS文件。这时,如果要引用WORK逻辑库中的文件,必须指定带有WORK逻辑库引用名的二级名称。当SAS会话结束时,存储在逻辑库user里的文件不会被删除。
sashelp逻辑库包含一组用于控制SAS会话各方面信息的目录(Catalog)和其他文件。该逻辑库中存储的这些目录和文件适用于任何使用该SAS系统的用户。用户的个性化设置会存储在sasuser逻辑库中。如果除了安装Base SAS软件外,还装了SAS的其他产品,那么这些产品需要用到的一些目录也会包含在sashelp逻辑库中。
sasuser逻辑库包含能够定制SAS特征以满足特定要求的SAS目录。如果默认的sashelp逻辑库对一些应用程序不适用,那么可以修改它们并将这些个性化的设置保存在sasuser逻辑库中。例如,在SAS里,可以在名称为sasuser.profile的个人Profile目录中存储个人默认的功能键设置或窗口属性。

2.1.2 SAS数据集

SAS数据集是存储在SAS逻辑库中、由SAS创建和处理的SAS文件,是SAS存储数据的主要方式。SAS数据集包含以表的观测(行)和变量(列)为形式存在的数据值,以及用以描述变量类型、长度和创建该数据集时所使用的引擎等信息的描述信息。根据其是否包含真正的数据值,SAS数据集可分为SAS数据文件和SAS视图。SAS数据文件包含数据和描述信息,在逻辑库中的成员类型是DATA;而SAS视图不包含数据值,是指向其他数据源的虚数据集,成员类型是VIEW。下面分别介绍SAS数据集的文件内容、命名,各种SAS数据文件和SAS视图,以及它们的创建方式。
1.?数据集文件
如图2.2所示给出了SAS数据集的逻辑组件,这些组件可能分布在操作系统下的不同文件中。

image

下面来具体看看图2.2中的各个组件。
描述信息:描述了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所示。其中包含了上面提到的数据集信息、主机相关信息和变量信息等。
  
image

提交PRINT过程代码,打印数据集信息。

proc print data=saslib.inventory noobs;
run;

上面代码打印的数据集如图2.4所示。
image

该数据集包含4个观测,每个观测表示一种产品的各类信息。这里有3个变量:Product_ID、Instock和Price,分别表示产品编号、库存数和价格。其中P001R、12、125等均为数据值。
2.?数据集命名
每个SAS数据集的完整名称如下:libref.SAS-data-set.membertype。共3个组成部分,从左到右依次为逻辑库引用名、数据集名称和成员类型。在引用数据集时,通常会指定前两个,SAS会根据上下文环境,例如该数据集出现的位置或数据集的自描述信息,来确定第三个。逻辑库引用名是与SAS数据集所在物理位置相关联的SAS逻辑库名。当创建新数据集时,逻辑库引用名表明要将该数据集保存在哪里(位置)。当引用SAS数据集时,逻辑库引用名会告诉SAS在哪个逻辑库中找到该数据集。
数据集名称遵守的SAS命名规则如下:
最大长度为32字符。
必须以字母(从A~Z,大小写均可)或下划线(_)开始。
可以是数字、字母和下划线(_)的任意组合。
成员类型由SAS指定,例如SAS数据文件的成员类型是DATA,SAS视图的成员类型是VIEW。这些对开发SAS程序是透明的。
在程序语句中创建和使用SAS数据集时,根据数据集所在的逻辑库或要存储的逻辑库来确定使用一级或二级名称。一级名称只包含数据集名称,用于读写临时逻辑库WORK中的数据集,或当逻辑库user被指定时读写逻辑库user中的数据集。二级名称由逻辑库引用名和数据集名称组成,形式为libref.SAS-data-set,访问除逻辑库user之外的其他永久逻辑库中的数据集时,均需要使用二级名称。
前面介绍过SAS数据文件和视图都是SAS数据集。SAS不允许在相同的逻辑库中存在数据集名称相同的SAS数据文件和视图。因为从语法上来讲,同一程序语句可以同时接受SAS数据文件和SAS视图,SAS不能从程序语句判断需要处理的是哪一个文件。
虽然在访问WORK或user逻辑库中的数据集时可以用一级名称,即可省略逻辑库引用名,但为了保持良好SAS代码编写风格,不建议省略。
3.?变量属性
SAS数据集变量的属性包括变量名、类型、长度、输出格式(format)、输入格式(informat)和标签(label)。输出格式、输入格式和标签是变量的可选属性。
每个变量的变量名必须遵守的SAS命名规范如下:
最大长度为32字节。
必须以字母(从A~Z,大小写均可)或下划线(_)开始。
可以是数字、字母和下划线(_)的任意组合。
变量的类型是字符型或数字型。字符型变量可包含任何值,而数字型变量只能包含数字值(数字0~9、=、-、点(.)和科学计数法的E)。变量类型确定了变量的缺失值如何显示。字符型变量缺失值是空格,而数字型的变量缺失值是点(.)。
SAS以数字值存储日期和时间。默认情况下,SAS的日期值指从1960年1月1日开始的天数,SAS使用从凌晨开始的秒数存储时间值, 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(销售数据)的缺失值为点(.)。
    
image

变量的长度与类型有关。字符变量的长度可以在定义时给出,否则其长度为第一次赋值时值的长度,最大长度可到32K。数字型变量的默认长度是8个字节,也可以指定不同的长度。
除了名称、类型和长度外,还可以定义变量的输出格式、输入格式和标签,这些都是可选属性。
格式(format)会影响数据值输出的方式。SAS提供了各种字符、数字和日期时间格式。例如,为了将23?000显示为23?000,必须使用COMMAw.d形式的输出格式。其中w表示最大宽度,d为小数位数。比如,在图2.5中,Date变量的输出格式为“YYMMDD10.”,打印时该变量的形式则为YYYY-MM-DD(例如2012-01-01)。Sales的输出格式为“COMMA10.”,对应的数据输出形式则为10?000。还可以创建并存储自定义的格式,具体在第5章介绍。
输入格式(informat)指定数据值以特定的格式读入,从而成为标准的SAS值。在读取包含字母或其他特殊字符的数字值时必须使用输入格式。例如,需要把输入值“$23000”读取为数字型的变量,则必须使用输入格式DOLLARw.d才能正确读入。自定义的格式也可以用作为输入格式。
SAS提供了丰富的输入输出格式用于从外部文件读取各种日期格式和显示各种日期格式,以满足对各种日期格式的需要。在上面的示例中使用输入格式“DATE9.”读入了“01JAN2012”形式的日期,输出时使用的是输出格式“YYMMDD10.”,从而将存储的数字显示为“2012-01-01”。
变量都可以有标签(label)。标签通常是描述该变量的文本,最大长度为256个字符。默认情况下,报表以变量名来标识变量,但是可以将一个标签分配给相应的变量来显示该变量的描述信息。上例中Emp_ID的标签为“员工编号”,Dept的标签为“部门”,Date的标签为“销售时间”,Sales的标签为“销售数据”。在代码中可以看到PRINT过程使用了LABEL选项,这样一来,打印的数据集表头将会使用各变量的标签而不是变量名称。
4.?SAS数据文件
与SAS视图相比较,SAS数据文件是一种在其文件中包含数据的数据集。SAS数据文件可以由DATA步创建,其名称在DATA语句中指定,还可以由PROC步创建,其名称通常是在该PROC步语句或PROC步的OUTPUT语句中指定的。有时,如果程序没有给输出数据集指定名称,SAS会使用默认名称。
有两种类型的数据文件:原生SAS数据文件和接口SAS数据文件。原生数据文件是SAS格式的文件,用来存储SAS格式的数据值和描述信息。接口数据文件是指数据以其他格式存在,并且SAS可以通过SAS/ACCESS接口引擎访问的数据文件,例如存在于Oracle、DB2、Sybase、ERP系统中的数据文件。SAS通过SAS/ACCESS接口引擎来访问这些文件中的数据,并将这些文件当作SAS数据集处理。
SAS程序语句创建的是原生SAS数据文件还是接口SAS数据文件,取决于该数据文件所属的逻辑数据库。如果该逻辑库是通过Base引擎定义的,则所生成的数据文件是原生数据文件,如果是通过SAS/ACCESS接口逻辑库定义的,则所创建的是接口SAS数据文件。
使用DATA步创建SAS数据文件的语法如下:
DATA 数据集名称;
… SAS语句…;
RUN;
其中,SAS语句用于指定数据源。不同的数据源,SAS语句也不尽相同。例如DATELINES语句表示从程序语句中读取数据,SET语句读取指定的输入数据集,INFILE语句读取指定的外部数据文件等。
上例中的DATA步给出了使用DATALINES语句读取列举输入数据的一个示例。该代码首先定义了一个物理路径为c:sasdata文件夹的SAS逻辑库saslib,接着以DATA关键字开始的DATA步创建了存储在逻辑库saslib中的数据集Inventory。
有些PROC步会在PROC语句或PROC步的OUTPUT语句中指定要输出的数据集。下面的代码使用SUMMARY过程对数据集trucks进行汇总,该过程的OUTPUT指定将输出写入数据集saslib.sumout中。

libname saslib 'c:\sas\data';

proc summary data=saslib.trucks; 
    var deaths;
    output out=saslib.sumout n=n;
run;

(1)SAS数据文件观测数
观测数是SAS数据文件的一个重要属性。SAS数据文件的观测数是文件中当前观测(行)和已删除观测的总和。可以通过执行CONTENTS过程或DATASET过程的CONTENTS语句列出数据集的观测数,所列出的观测数是观测和已删除观测的总和。参考图2.3,该数据集观测数在CONTENTS过程打印的第一个表格的第一列(“观测”项)中给出。
了解观测数有助于管理文件大小并评估磁盘空间要求。SAS数据文件可计算的最大观测数由操作系统的长整型大小决定。
SAS使用所在操作系统内部的长整型数来记录数据集的观测数。在32位操作系统中,长整型为32位,数据文件的最大观测数是231-1。在64位操作系统中,当长整型长度为64位时,最大观测数是263-1。在64位的操作系统中,长整型长度为64位时,SAS数据文件不可能达到最大观测数,但是在32位操作系统中,达到最大值时有发生,一定要注意这点。同样需要注意的是,即使在微软的Windows 64位版本的操作系统中,其长整型数据类型实际使用的是32位模型,以便维持与32位应用的兼容性。从SAS 9.3开始,也可以通过设置选项EXTENDOBSCOUNTER=YES来扩展新输出SAS数据文件中的最大观测数。这样,即使在使用32位长整型存储观测数的操作系统中,所创建的SAS数据文件的最大观测数也能达到263-1。
当达到最大观测数时,SAS如何处理取决于该数据文件是否有索引,或是否使用了索引的完整性限制。
如果该SAS数据文件有索引或使用了索引的完整性限制(唯一键、主键和外键),SAS会产生错误消息。可以删除索引或完整性限制并继续处理。但是因为文件超过了最大观测数,有些功能会受限制(受限制的功能会在下面介绍)。而且,如果要维持索引或完整性限制,必须重建该SAS数据文件。从SAS 9.4开始,当创建SAS数据文件时,默认会创建扩展的观测数。有兴趣的读者可查看SAS帮助文档获取更多信息。
如果没有使用索引,SAS会继续后续处理并且接受额外的观测,不会有消息表明该SAS数据文件已经达到或超过最大观测数。
当文件超过最大观测数时,任何需要观测数的操作都不可用。例如,返回观测数的SAS过程(例如PRINT过程或CONTENT过程)会返回缺失值(.);依赖于观测数的SAS过程(例如SORT过程或COMPARE过程)会返回不可预知的结果;当请求压缩文件时,压缩比例不可计算;不能创建索引或完整性限制等。为了重获这些功能,可以重新创建带扩展观测数的SAS数据文件。
(2)审计追踪SAS文件
可以通过DATASETS过程对SAS数据文件创建审计追踪SAS文件,用来记录SAS数据文件的修改历史。每当观测被删除或更新时,谁在什么时候修改了什么的信息都会被写入审计文件。许多业务和组织为了安全都会要求审计追踪。审计追踪维护了历史信息,历史信息可用于追踪单块数据从录入数据文件开始到离开的所有信息。
在使用APPEND过程对数据文件进行附加操作时,如果因为完整性限制拒绝导致附加操作失败,审计追踪将是SAS中存储这些失败观测的唯一技术。可以使用DATA步从审计跟踪文件中抽取失败或拒绝的观测,然后根据失败原因描述信息来纠正它们,最后将它们重新应用于该数据文件。
5.?SAS视图
SAS视图本身并不存储数据值,它仅包含描述信息和从其他SAS数据集或从存储为其他软件厂商文件格式的文件中获取数据所需要的信息。SAS视图的成员类型是VIEW。
可使用SQL过程、ACCESS过程或者DATA语句的VIEW选项来创建SAS视图。根据创建的方式,视图又分为SQL视图、接口SAS视图和DATA步视图。其中SQL视图和DATA步视图都称为原生视图,SAS/ACCESS视图称为接口视图。关于SQL视图的内容在本书第6章介绍。
创建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步的输出不需要存储为数据集,比如绘制报表,这种处理可更有效地利用计算机资源。

2.1.3 SAS逻辑库和数据集管理

SAS逻辑库和数据集可以通过SAS程序语句进行管理,例如LIBNAME语句、DATA步、DATASETS过程、APPEND过程和CONTENTS过程等。DATA步提供了许多功能对SAS数据集进行处理(本书后面的章节会具体介绍)。
1.?LIBNAME语句
LIBNAME的LIST选项可以将一个或多个SAS逻辑库属性打印在日志中。其基本形式如下:

LIBNAME逻辑库引用名 LIST;
LIBNAME _ALL_ LIST;

LIBNAME的CLEAR选项用于清除一个或多个逻辑库引用名与SAS逻辑库之间的关联关系。清除了关联关系的逻辑库引用名在SAS会话中不再有效。其基本形式如下:

LIBNAME逻辑库引用名 CLEAR;
LIBNAME _ALL_ CLEAR;

LIBNAME还有更多对SAS逻辑库的管理功能,可参考SAS帮助文档进行学习。
2.?CONTENTS过程
CONTENTS过程用于显示数据集的描述信息内容,并打印SAS逻辑库的目录。通常,CONTENTS过程和DATASETS过程的CONTENTS语句相同。该过程的基本形式为:

PROC CONTENTS DATA=数据集名称;
RUN;

在前面的各节中已经使用CONTENTS过程显示了数据集属性内容,如图2.3所示。
3.?DATASETS过程
DATASETS过程提供了强大的SAS数据文件管理功能,对数据集而言,除了可显示数据集的描述信息外,还可用于追加观测、修改变量名、删除数据集等。对于该过程,可通过SAS帮助文档进行学习。
当需要修改一个数据集的变量属性时,使用DATASETS过程可以在不读取数据集观测的情况下直接修改变量属性。虽然也可以通过使用DATA步的SET语句基于一个数据集创建新的数据集,并为新数据集指定不同的属性来实现相同的功能,但这样SAS会读写所有的观测,造成资源浪费,当数据集较大时会非常耗时。
4.?SAS资源管理器
此外,我们也经常会通过SAS窗口环境的“SAS资源管理器”来管理逻辑库以及逻辑库中的SAS文件。这里主要介绍SAS提供的对SAS逻辑库和数据集的一些实用管理操作,具体操作可以根据各个菜单项对应的向导提示步骤完成,这里不赘述。
(1)逻辑库管理
启动SAS窗口环境,双击“SAS资源管理器”窗口的“SAS逻辑库”图标,显示该SAS会话可用的所有逻辑库,包括临时逻辑库WORK、系统逻辑库sashelp、sasuser和用户定义的逻辑库。在“逻辑库”目录下,可以通过菜单“文件”“新建”,或右键单击空白处从浮动菜单选择“新建”来创建新逻辑库。“新建逻辑库”对话框如图2.7所示。这里与通过程序语句定义SAS逻辑库一样,需要指定逻辑库名称、引擎和物理路径信息。还可以通过勾选“启动时启用”来指定该逻辑库在Base SAS启动时即创建并启用,或在“选项”输入框里指定相应选项。
右键单击刚才创建的逻辑库saslib,会显示该逻辑库可用选项的浮动菜单。用户定义的逻辑库浮动菜单如图2.8所示。可以通过该浮动菜单实现:在该逻辑库中查找成员、为该逻辑库添加新的成员、删除该逻辑库和显示其属性。
   
image

(2)数据集管理
通过“SAS资源管理器”可以浏览逻辑库的内容,在浏览时,可以选定逻辑库的数据集(表)进行操作。可通过浮动菜单完成如下操作:查看数据集、将数据集导出为Excel文件、复制、删除、重命名SAS数据集和创建副本等,如图2.9所示。
image

5.?VIEWTABLE窗口
在“资源管理器”窗口双击SAS数据集,会在VIEWTABLE窗口中打开当前SAS数据集。默认打开方式为浏览模式,该模式能保护数据不会被更改。在浏览模式下,可以定制数据集视图,例如,排序、改变列显示颜色和字体、显示标签或删除添加变量。选中数据集的一个变量(列),右键单击显示的浮动菜单如图2.10所示。可选择不同的菜单项,通过菜单项向导完成这些定制功能。

image

在当前活动窗口为VIEWTABLE窗口时,可以通过菜单将浏览模式修改为编辑模式,选择“编辑”“编辑模式”。在该模式下可以进行在该窗口修改数据值、按列排序等操作,并且使用菜单“文件”“保存”或“另存为”,来保存该数据集或建立新的SAS数据集。

2.1.4 SAS系统选项

SAS的复杂之处在于存在众多选项(option),读者需要细心掌握。根据SAS选项出现的位置、功能和作用范围来区分,一般分为系统选项、数据集选项和语句选项(即在语句中出现的选项)。本书会不断地介绍这些选项,建议读者针对这些选项的类别和用法进行总结。
SAS系统选项是影响整个会话过程中SAS程序处理或交互式SAS会话的指令。SAS系统选项所控制的内容包括SAS输出的外观、SAS对所使用文件的处理形式、SAS数据集中观测的处理形式(例如OBS选项),SAS初始化特性(例如MEMSIZE选项),以及SAS如何与主机操作系统交互等。系统选项被指定时即开始产生影响,直到其被改变。
数据集选项是为数据集操作指定的选项,应用于其所作用的SAS数据集。有些数据集选项有对应的系统选项或LIBNAME选项,例如选项OBS=。
在下面的代码中,前一个PROC过程受数据集选项OBS的控制,而后一个PROC过程受系统选项OBS的控制。

options obs=10;

title "数据集选项OBS=生效打印5条观测";
proc print data=sashelp.shoes (obs=5);
run;

title "系统选项OBS=生效打印10条观测";
proc print data=sashelp.shoes;
run;

两个PRINT过程分别打印shoes数据集的前5条和10条观测,结果如图2.11所示。
语句选项出现在SAS语句中,用于控制该语句的行为。全局语句中的选项会有更加广泛的影响,例如LIBNAME=语句选项影响特定逻辑库的所有执行。如果LIBANME语句的ACCESS选项值为ONLY,则对该逻辑库中的所有数据集都不能进行更新或写入操作。
image

1.?指定SAS系统选项
SAS系统选项可通过多种方式指定。常见的指定SAS系统选项的方法有:通过启动SAS时的命令行和配置文件指定,或者SAS启动后通过OPTIONS语句或SAS系统选项窗口指定。
在UNIX环境下,如果启动SAS时通过命令行将临时逻辑库WORK的物理路径设置为/SASWORK,则SAS的启动命令行如下:

/opt/SASHome/SASFoundation/9.4/sas -work /SASWORK

如果是通过配置文件指定的,则将该选项写入配置文件中。SAS配置文件在第1章中已经介绍过了。SAS启动后在OPTIONS语句中指定系统选项的形式如下:

OPTIONS 选项1 <选项2> <选项3> …;

前面已经给出了通过OPTIONS语句给出指定OBS=选项值的示例。
关于通过SAS系统选项窗口指定和查看系统选项值的情况,会在后面介绍。
2.?查看系统选项值
如果数据集选项和语句选项出现在当前起作用的位置,可以很容易地查看。但是,要看到当前起作用的SAS系统选项值和当前值是通过何种方式设置的就没那么容易了,因为SAS为系统选项提供了默认值,并且有多种方式可以设定系统选项值。对此,可以使用OPTIONS过程、GETOPTIONS函数或通过“SAS系统选项”窗口指定选项名称来查看。
带VALUE选项的OPTIONS过程将指定选项的值、范围及该值如何设置的信息打印到“日志”窗口的基本形式如下:

PROC OPTIONS OPTION=选项名称 VALUE;
RUN;

在SAS窗口提交如下代码:

options obs=20;

proc options option=obs value;
run;

在“日志”窗口打印的输出信息如图2.12所示。从该图可以看出,OPTION过程打印选项obs值为20,显示该值是通过OPTIONS语句设置的。
不使用选项VALUE时仅返回该选项值。
image

将GETOPTION函数作为%SYSFUNC宏函数的参数,从而获取系统选项设置的基本形式如下:

%PUT %SYSFUNC(GETOPTION(选项名称));

在SAS窗口提交如下代码:

options obs=20;

%put %sysfunc(getoption(obs));

在“日志”窗口打印输出的信息如图2.13所示。从该图可以看出,选项OBS的值为20。
image

在GETOPTIONS函数中还可添加其他参数,显示指定选项的其他信息,例如默认值、启动时的值,以及该值如何设置等。
3.?SAS系统选项窗口
通过“SAS系统选项”窗口菜单可以查看和管理SAS系统选项。选择菜单“工具”“选项”“系统”,会打开“SAS系统选项”窗口。该窗口对SAS系统选项进行了分组,如图2.14所示。可以通过“选项组”的浮动菜单展开该分组或在该分组中查找系统选项。展开选项组、子选项组直到右侧窗口出现具体的系统选项,可通过具体选项的浮动菜单修改该选项值或将该选项值重置为默认值。

image

在左侧窗口单击“日志和过程输出控制”“过程输出”,右侧窗口会显示“过程输出组的选项”窗格,如图2.15所示。右键单击要修改其值的系统选项,通过浮动菜单修改该选项值或将该选项值重置为默认值。例如,右键单击Center,选择“修改值”,在“修改值”对话框选择或设置新值,单击“确定”按钮保存该选项值。

image

2.1.5 SAS程序结构

SAS程序用于访问、管理、分析和展现数据。其基础组成部分是DATA步和PROC步,PROC步又称为SAS过程。一个SAS程序可包含以任意顺序组合的多个DATA步和多个PROC步。
DATA步通常用于创建和操作数据集,还可用于产生定制的报表。例如,DATA步可用于计算值、检查并修正数据中的错误、将数据存储到SAS数据集中以便于下次使用,以及通过对存在的数据集取子集、合并或更新,产生新的数据集。DATA步由关键字DATA开始。
PROC步是一些预先写好的例程,不同的PROC步其功能不同。PROC步能够用来分析和处理SAS数据集中的数据,并以适当的形式展现数据和信息。有些PROC步会创建包含该过程结果的新SAS数据集。PROC步可列出、排序和汇总数据,也可以产生描述性的统计量,并对其进行分析和优化,从而创建汇总报告、产生图表等。PROC步由关键字PROC开始。
SAS程序还包含SAS语句,每条SAS语句通常以SAS的关键字开始,并总是以分号结束。DATA步和PROC步通常包含多条语句。SAS语句的形式很自由,可以在一行的任何地方开始和结束,每条语句可跨越多行,多条语句也可以在同一行。语句中的“词”以空格或特殊字符分开。SAS语句不区分大小写,但是在大多数时候,在引号中的文本是区分大小写的。
下面通过示例来理解DATA步、PROC步和SAS语句。在图2.16中,SAS语句、DATA步和PROC步都已经标识出来。

image

可以在SAS程序的任何地方使用注释语句来说明程序的目的、解释不好理解的程序片段,或者描述复杂程序中的一些步骤或计算原理。注释有两种基本形式,第一种如下:
*消息;
消息为注释的内容,可以是任意长度,但必须写为单独的语句,以分号结束,且内部不能包含分号。
第二种形式如下:

/*消息*/

消息为注释的内容,也可以是任意长度,可以嵌套任何类型的注释,还可以包含分号和不匹配的引号。宏语言(在后面章节中介绍)中使用注释时,必须使用这种方式。
下面是使用注释的几个例子。
例2.1:

*Do NOT edit below this line!;

例2.2:

/* Do NOT edit below this line! */

例2.3:

/***********************************************************
 *                    PROGRAM SETUP
 * Use this section to alter macro variables, options, or 
 * other aspects of the test.  No Edits to this Program are 
 * allowed past the Program Setup section!!
 ***********************************************************/
相关文章
|
12天前
|
SQL 分布式计算 监控
Sqoop数据迁移工具使用与优化技巧:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入解析Sqoop的使用、优化及面试策略。内容涵盖Sqoop基础,包括安装配置、命令行操作、与Hadoop生态集成和连接器配置。讨论数据迁移优化技巧,如数据切分、压缩编码、转换过滤及性能监控。此外,还涉及面试中对Sqoop与其他ETL工具的对比、实际项目挑战及未来发展趋势的讨论。通过代码示例展示了从MySQL到HDFS的数据迁移。本文旨在帮助读者在面试中展现Sqoop技术实力。
26 2
|
21天前
|
存储 缓存 安全
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
|
29天前
|
算法 Linux C++
【Linux系统编程】解析获取和设置文件信息与权限的Linux系统调用
【Linux系统编程】解析获取和设置文件信息与权限的Linux系统调用
29 0
|
29天前
|
算法 Linux C++
【Linux系统编程】深入解析Linux中read函数的错误场景
【Linux系统编程】深入解析Linux中read函数的错误场景
204 0
|
30天前
|
机器学习/深度学习 算法 编译器
【C++ 泛型编程 中级篇】深度解析C++:类型模板参数与非类型模板参数
【C++ 泛型编程 中级篇】深度解析C++:类型模板参数与非类型模板参数
47 0
|
24天前
|
存储 缓存 算法
Python中collections模块的deque双端队列:深入解析与应用
在Python的`collections`模块中,`deque`(双端队列)是一个线程安全、快速添加和删除元素的双端队列数据类型。它支持从队列的两端添加和弹出元素,提供了比列表更高的效率,特别是在处理大型数据集时。本文将详细解析`deque`的原理、使用方法以及它在各种场景中的应用。
|
26天前
|
安全 Java 数据安全/隐私保护
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
57 1
|
2天前
|
SQL 分布式计算 资源调度
一文解析 ODPS SQL 任务优化方法原理
本文重点尝试从ODPS SQL的逻辑执行计划和Logview中的执行计划出发,分析日常数据研发过程中各种优化方法背后的原理,覆盖了部分调优方法的分析,从知道怎么优化,到为什么这样优化,以及还能怎样优化。
|
2天前
|
Java
并发编程之线程池的应用以及一些小细节的详细解析
并发编程之线程池的应用以及一些小细节的详细解析
16 0
|
7天前
|
API Python
Python模块化编程:面试题深度解析
【4月更文挑战第14天】了解Python模块化编程对于构建大型项目至关重要,它涉及代码组织、复用和维护。本文深入探讨了模块、包、导入机制、命名空间和作用域等基础概念,并列举了面试中常见的模块导入混乱、不适当星号导入等问题,强调了避免循环依赖、合理使用`__init__.py`以及理解模块作用域的重要性。掌握这些知识将有助于在面试中自信应对模块化编程的相关挑战。
20 0

推荐镜像

更多