SAS数据集

时间:2022-04-30 08:21:48

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

1.数据集文件

SAS数据集

下面来具体看看上图中的各个组件。

  1. ·描述信息:描述了SAS数据集自身及其变量的属性,包括观测数、 观测长度、该数据集上次的修改日期等其他信息。其变量的描述信息包 括名称、类型、长度、输入输出格式、标签,以及是否已经为该变量建 立索引等属性。
  2. ·数据值:以矩形表的形式排列。一个数据集可包含若干个观测(也称为行),每个观测通常由一个或多个变量(也称为列)值组成。
  3. ·索引:是单独的SAS文件,可以为SAS数据文件创建索引,以提供 对指定观测的直接访问。索引文件与其数据文件有着相同的名称,但成员类型为INDEX。索引可提供对指定观测更快的访问,尤其是对较大的数据集而言。
  4. ·扩展属性:是定义在数据集或变量之上的元数据。扩展属性使用DATASETS过程创建,表示为<名称-值>对。

下面以一个简单的SAS数据集为例,来理解数据集的描述信息、观测和变量。

在SAS窗口提交如下代码生成数据集:

libname  saslib  'c:\sas\data';
data saslib.Inventory;
input Product_ID $ Instock Price;
datalines; P001R 125.00
P003T 40.00
P301M 500.00
PC02M 100.00
;
run;

使用CONTENTS过程打印数据集的属性信息,代码如下:

proc  contents  data=saslib.inventory;
run;

CONTENTS过程生成的结果如图2.3所示。其中包含了上面提到的 数据集信息、主机相关信息和变量信息等。

SAS数据集

图2.3 数据集描述信息输出

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

proc print data=saslib.inventory  noobs;
run;

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

SAS数据集

图2.4 数据集数据值

该数据集包含4个观测,每个观测表示一种产品的各类信息。这里 有3个变量:Product_ID、Instock和Price,分别表示产品编号、库存数和价格。其中P001R、12、125等均为数据值。

2.数据集命名

命名格式:

libref.SAS-data-set.membertype

共3个组成部分,从左到右依次为逻辑库引用名、数据集名称和成员类型。在引用数据集时,通常会指定前两个,SAS会根据上下文环境,例如该数据集出现的位置或数据集的自描述信息,来确定第三个。逻辑库 引用名是与SAS数据集所在物理位置相关联的SAS逻辑库名。当创建新 数据集时,逻辑库引用名表明要将该数据集保存在哪里(位置)。当引用SAS数据集时,逻辑库引用名会告诉SAS在哪个逻辑库中找到该数据 集。

数据集名称遵守的SAS命名规则如下:

  1. ·最大长度为32字符。
  2. ·必须以字母(从A~Z,大小写均可)或下划线(_)开始。
  3. ·可以是数字、字母和下划线(_)的任意组合。

成员类型由SAS指定,例如SAS数据文件的成员类型是DATA,SAS视图的成员类型是VIEW。(一般情况下不需要去使用)

3.变量属性

SAS数据集变量的属性包括变量名、类型、长度、输出格式(format)、输入格式(informat)和标签(label)。输出格式、输入格式和标签是变量的可选属性。

每个变量的变量名必须遵守的SAS命名规范如下:

  1. ·最大长度为32字节。
  2. ·必须以字母(从A~Z,大小写均可)或下划线(_)开始。
  3. ·可以是数字、字母和下划线(_)的任意组合。 变量的类型是字符型或数字型。字符型变量可包含任何值,而数字型变量只能包含数字值(数字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,$,01JAN2012
ED002,,$,01FEB2012
ET004,TSG,$,02MAR2012
EC002,CSG,$,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(销售数据)的缺失值为点(.)。

SAS数据集

图2.5 变量属性

SAS数据集

图2.6 打印数据集

格式(format)会影响数据值输出的方式。SAS提供了各种字符、数字和日期时间格式。例如,为了将23000显示为23000,必须使用 COMMAw.d形式的输出格式。其中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个字符。默认情况下,报表以变量名来标识变量,但是可以 将一个标签分配给相应的变量来显示该变量的描述信息。上例中 Emp_ID的标签为“员工编号”,Dept的标签为“部门”,Date的标签为“销 售时间”,Sales的标签为“销售数据”。在代码中可以看到PRINT过程使 用了LABEL选项,这样一来,打印的数据集表头将会使用各变量的标 签而不是变量名称。

label var1=name1 var2=name2;

4.SAS数据文件

SAS数据文件是一种在其文件中包含数据的数据集。

有两种类型的数据文件:原生SAS数据文件和接口SAS数据文件。

  1. 原生数据文件是SAS格式的文件,用来存储SAS格式的数据值和描述信 息(逻辑库是通过Base引擎定义的)。
  2. 接口数据文件是指数据以其他格式存在,并且SAS可以通过 SAS/ACCESS接口引擎访问的数据文件,例如存在于Oracle、DB2、Sybase、ERP系统中的数据文件。SAS通过SAS/ACCESS接口引擎来访问这些文件中的数据,并将这些文件当作SAS数据集处理(通过SAS/ACCESS 接口逻辑库定义的)。

使用DATA步创建SAS数据文件的语法如下:

DATA  数据集名称;
… SAS语句…;
RUN;

其中,SAS语句用于指定数据源。不同的数据源,SAS语句也不尽相同,常用的3中如下。

  1. DATELINES语句表示从程序语句中读取数据
  2. SET语句读 取指定的输入数据集
  3. 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视图有如下优点:

  1. ·可以节省磁盘空间,因为SAS视图不存储实际数据,仅仅存储去哪儿找到数据及数据如何格式化的指令。
  2. ·因为数据总是在执行时才从SAS视图中获取,这样能保证输入的数据集总是当前的。
  3. ·SAS视图可减少由于数据设计的改变对用户造成的影响。例如,可以改变存储在SAS视图里的查询信息而不必改变视图结果的特征。
  4. ·使用SAS/CONNECT软件,SAS视图可连接不同主机计算机上的SAS数据集,然后展示公司分布式数据的集成视图。

SAS视图可用于以下操作:输入其他DATA步或PROC步,将数据 迁移到SAS数据文件或SAS支持的数据库管理系统中,使用PROC SQL 与其他数据组合。

在选择使用SAS数据文件还是SAS视图时需要考虑以下方面:

  1. ·数据文件会使用额外的磁盘空间,而SAS视图会占用额外的处理时间。
  2. ·数据文件变量可在使用前排序和创建索引,而SAS视图在执行过程 中只能以其存在的形式处理数据。

6.特殊的数据集

还有一种特殊的数据集:_NULL_。如果想执行一个DATA步又不 想创建SAS数据集,可以指定关键字_NULL_作为数据集名称。代码如 下:

data  _null_;

SAS会执行该DATA步里面的语句但不会创建新数据集,不会有观 测或变量写入任何数据集。如果一个DATA步的输出不需要存储为数据 集,比如绘制报表,这种处理可更有效地利用计算机资源。

SAS数据集的更多相关文章

  1. SAS进阶《深入解析SAS》之Base SAS基础、读取外部数据到SAS数据集

    SAS进阶<深入解析SAS>之Base SAS基础.读取外部数据到SAS数据集 前言:在学习完<SAS编程与商业案例>后,虽然能够接手公司的基本工作,但是为了更深入的SAS学习 ...

  2. SAS学习笔记之《SAS编程与数据挖掘商业案例》(3)变量操作、观测值操作、SAS数据集管理

    SAS学习笔记之<SAS编程与数据挖掘商业案例>(3)变量操作.观测值操作.SAS数据集管理 1. SAS变量操作的常用语句 ASSIGNMENT 创建或修改变量 SUM 累加变量或表达式 ...

  3. SAS学习笔记51 SAS数据集

    结构 SAS数据集是关系型的,包含两个部分:描述部分(变量)和数据部分(观察值) 形式 SAS系统*有两种类型的数据集: 1.SAS 数据文件(SAS datafiles) 2.SAS 数据视窗(S ...

  4. SAS学习笔记50 SAS数据集索引

    在没有索引的情况下,SAS是一条接一条的扫描观测:有索引时,直接跳到该索引对应的观测所在位置.总结一句话就是:节省时间,节省内存,提高效率 当然并不是任何情况下使用索引都能提高工作效率,因为建立索引本 ...

  5. SAS笔记&lpar;8&rpar; 利用数组重构SAS数据集

    在实际应用中,我们经常会把宽数据(一个患者一条观测)转化为长数据(一个患者多条观测)或者将长数据(一个患者多条观测)转换为宽数据(一个患者一条观测),在R中我们可以利用Reshape2包来实现.在SA ...

  6. SAS数据集推送到sql server 数据库 实现代码段

    libname fdsas ODBC datasrc=fdsas user=fdsas password=fdsas123 preserve_tab_names=yes connection=shar ...

  7. sas 数据集导出到excel

    PROC EXPORT DATA= Loan.BOM_FILENAME_2      OUTFILE= "D:\output.xls"      DBMS=EXCEL REPLAC ...

  8. SAS 数据集生成map 文件

    OPTIONS NOCENTER PS=MAX LS=MAX; LIBNAME S '.'; DATA A;    INPUT X $ @@;    CARDS;A1 A2 A3 B1 B2 B3   ...

  9. SAS︱数据索引、数据集常用操作&lpar;set、where、merge、append&rpar;

    代码部分大多来源于姚志勇老师的<SAS编程与数据挖掘商业案例>. 每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ ------------ ...

随机推荐

  1. FFT时域与频域的关系,以及采样速率与采样点的影响

    首先对于FFT来说,输入的信号是一个按一定采样频率获得的信号序列,而输出是每个采样点对应的频率的幅度(能量). 下面详细分析: 在FFT的输出数据中,第一个值是直流分量的振幅(这样对应周期有无穷的可能 ...

  2. Shell脚本&lowbar;位置参数和预定义参数

    一.位置参数变量   1.输出两个输入参数之和 l1.sh 1 2 3 4 5 6 7 8 9 #!/bin/bash   num1=$1 num2=$2 sum=$((num1+num2))   # ...

  3. Eclipse中使用SVN

    1.在Eclipse里下载Subclipse插件   方法一:从Eclipse Marketplace里面下载 具体操作:打开Eclipse --> Help --> Eclipse Ma ...

  4. Terminal的快捷键 for Terminal for Mac OS 10&period;10&comma; Linux&sol;GNU&lpar;Ubuntu&comma; deepin&comma; elementory os&comma;CentOS&rpar;

    对于习惯用windows键盘的,突然转成Mac蓝牙键盘真的有点不习惯,尤其是多了⌘这个键,还有Alt键也成了Option 但是对于Windows下熟悉的快捷键,它们真的失效了,还好Ubuntu也常用, ...

  5. android-sdk-windows版本号下载

    Android SDK 4.0.3 开发环境配置及执行 近期又装了一次最新版本号的ADK环境 眼下最新版是Android SDK 4.0.3 本文的插图和文本尽管是Android2.2的 步骤都是一样 ...

  6. JAVA在IO流量汇总

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42119261 我想你对JAVA的IO流有所了解,平时使用的 ...

  7. MocorDroid编译工程快速建立编译环境

    function sprdLunch(){    declare -a arrProj    arrProj=`find out/target/product -name previous_build ...

  8. 细说Asp&period;Net Web API消息处理管道(二)

    在细说Asp.Net Web API消息处理管道这篇文章中,通过翻看源码和实例验证的方式,我们知道了Asp.Net Web API消息处理管道的组成类型以及Asp.Net Web API是如何创建消息 ...

  9. CF 1145 (愚人节比赛)

    D题 题目就是让你找出题面中拼错的单词,拼错的字母组合成一句话就是正确的题面. two plus xor of third and min elements #include<bits/stdc ...

  10. egret&period;Shape渲染集合图形

    代码: class Main extends egret.DisplayObjectContainer { public constructor() { super(); this.addEventL ...