热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从程序员到数据科学家:SAS编程基础(05)

操纵数据是数据学家的重要工作内容之一,主要用来为数据分析或创建报表准备必要的内容。传统数据仓库领域的数据工作(ETL或ETCL)——数据的




操纵数据是数据学家的重要工作内容之一,主要用来为数据分析或创建报表准备必要的内容。传统数据仓库领域的数据工作(ETLETCL)——数据的抽取(Extract)、转换(Transformation)、清洗(Clean)和加载(Load)都是数据科学家的家常便饭。

SAS 组织管理数据的最基本单位是SAS 逻辑库(SAS Library)和SAS 数据集(SAS Dataset)。细心的读者也许会记得SASHelloWorld 程序,第一行都是以 Data 语句开头?因为 SAS 语言就是面向数据分析的专门语言,SAS的世界里数据是分析的基础,也是从数据到智能的基石。后面我们会逐渐领略到 数据就是分析的基础” 这一精髓!

SAS 逻辑库是SAS为面向数据处理而设计的 引用和存储 单位,是SAS组织数据的顶级单位。一个SAS 逻辑库可以包含若干 成员(Member),其中最常用的成员为 SAS数据集(SAS Dataset)。SAS 逻辑库和 SAS数据集的概念可分别对应传统关系型数据库(RDBMS)的数据库和数据表的概念,但SAS 逻辑库包含更加丰富的数据内容和灵活的结构。

SAS 系统预定义了若干系统逻辑库,每次启动SAS运行环境(也称为建立一个SAS会话)的时候,这些逻辑库就已经自动建立,供用户使用。一般包含5永久库(sasuser,sashelp3个地图专用的逻辑库:mapsmapsgfkmapssas)和一个临时库 work

1.临时库(WORK):每次启动 SAS 运行环境的时候,SAS都会有一个临时逻辑库 work被建立。临时库 work 用于SAS 会话期间临时存储和访问数据,SAS 会话结束(即退出SAS运行环境)后临时库work和其中的内容会被自动删除。

比如:在Windows 平台的SAS中,每次启动一个SAS会话,系统会在操作系统临时目录%TEMP%下的“SAS Temporary Files”目录中创建一个会话特定的临时路径(比如:C:\Users\sbjyiw\AppData\Local\Temp\SAS Temporary Files\ _TD8212_SBJYIW_),这是SAS 会话期间存放各种临时数据的磁盘路径。

2.永久库:永久库中的数据并不因SAS 会话结束而消失,也就是SAS运行结束后那些数据依然存在。SAS 会话的永久库由SAS启动过程中使用的那个配置文件 sasv9.cfg 来指定。

注意:SAS几乎支持所有的语言和编码,在SAS 安装环境中sasv9.cfg 配置文件有多个,默认提供英文版支持DBCS的英文版,Unicode版、和十余种语言特定的版本,对应SAS 安装后的启动菜单。sasv9.cfg 也支持使用 -config 参数指向另一个配置文件sasv9.cfg 来重用其设置,从而构成配置文件体系。

sashelp:逻辑库 sashelp是系统预定义的只读逻辑库,提供系统初始化后可用的数据。逻辑库sashelp sasv9.cfg 中由以下配置被映射到多个目录,从中读取可用的数据集文件。

SASHELP (

        "!SASCFG\SASCFG"

        "!SASROOT\nls\zh\sashelp"

        "!SASROOT\core\sashelp"

                       …

        )

sasuser:逻辑库 sasuser是系统预定义的可写逻辑库,用来在SAS 会话运行期间存放当前用户特定的数据。一般用来隔离不同SAS用户数据。

逻辑库 sasuser sasv9.cfg 中使用 -SASUSER 指定,对应于操作系统中的用户主目录或者数据库中的特定用户数据库。比如在 Windows 系统中,-SASUSER 被指向 "?CSIDL_PERSONAL\My SAS Files\9.3",比如:C:\Users\sbjyiw\Documents\My SAS Files\9.3

3.用户库:也称用户自定义逻辑库,用户可以在 SAS程序中用libname 语句自定义若干用户库,用来引用存放于磁盘上或者其他数据库服务器上的数据。比如:

libname mylib 'c:\temp'*定义我的逻辑库;

* mylib 中创建系统逻辑库 sashlep.class 的拷贝,实际上文件存于 c:\temp;

data mylib.foo;

     set sashelp.class;

run;

*打印我的数据 mylib.foo,实际上引用 c:\temp\foo.sas7bdat;

proc print data=mylib.foo;

run;

不管SAS运行在什么操作系统上,你可以用同样的逻辑库引用名(Library reference name)来引用你的SAS 逻辑库,逻辑库引用名是当前SAS会话能够识别的逻辑名称,指向某个操作系统能够识别的物理位置或者数据访问引擎的访问入口。逻辑库引用在SAS代码中隔离了操作系统或数据库系统的物理位置,提高了代码的可移植性

你也可以在任何需要的时候,改变某个逻辑库引用的物理指向或者清除已经分配的某个逻辑库引用

*注意改变逻辑库 mylib 的指向为 c:\windows;

libname mylib "c:\windows";

*注意清除逻辑库 mylib, 此语句后 mylib 将不再可用;

SAS并不删除c:\temp 目录中任何物理文件内容;

libname mylib clear;

SAS代码里,如果你想要删除 c:\temp 目录中的物理文件 foo.sas7bdat,可以调用如下语句:

*删除数据集 mylib.foo,磁盘上的物理文件也相应删除;

proc datasets library=mylib;

   delete foo;

run;

 SAS 运行环境中,你可以用鼠标右键点击逻辑库来查看逻辑库的属性,如下。

你也可以使用 libname 语句的 LIST功能在日志窗口中显示逻辑库信息,你也可以使用关键字_ALL_ 来列出系统中所有可用的逻辑库的信息。

libname mylib LIST;

libname _ALL_ LIST;

输出如下:

SAS 数据集(Dataset)

SAS 数据集是一种SAS特定的结构化数据文件,这种表状数据由变量(列)和观测(行)组成。变量和观测对应传统数据库中表的列和行

SAS数据集从结构上看包括 描述部分  数据部分。描述部分是数据的元数据,主要包括数据集的属性信息,比如数据集名称文件编码创建日期,观测数目(行数)、变量数目(列数)、以及每一个变量的具体属性定义(名称、类型、长度、标签、输入/输出格式)等。数据部分就是每一行记录本身。要查看数据集的元数据,可以使用 PROC CONTENTS 过程步来显示。

proc contents data=sashelp.class;

run;

 SAS 代码中,数据集 [Libref.]dsname 两级名称进行引用,如果是临时库 WORK中的数据,则可以省略逻辑库引用名。

l  SAS 数据集中的每一列,在SAS代码里称为变量,其名称由1-32字节长的字母、下划线和数字组成,但不能以数字开始SAS内部用大写形式创建变量,故SAS代码中不区变量名称的大小写。

l  SAS变量类型包括 字符型  数值型 ,缺省都是8字节长字符类型的变量值可为1-32767个字节,数值型可为2-8任意字节长的整数或浮点数(Windows/Linux3-8,IBM大型机为 2-8)

注意:这儿谈论的SAS变量类型是传统意义上SAS数据集中的数据类型,在后面章节中我们将看到其实SAS代码能支持更加丰富的数据类型。然而,一旦持久化到SAS数据集后则只有定长字符型和数值型两大类数据类型。

l  SAS变量的输出格式用于指定该变量(列) 的缺省输出格式。这样相同的SAS内部存储值可以根据不同的输出格式生成不同的字符串表达。SAS 变量的输入格式则用于告诉SAS按照该输入格式从外部数据源读取数据到SAS 数据集中。下面将重点讲一下SAS输入输出格式。

SAS 输入输出格式 

SAS 输入/输出格式就是一个包含小数点 . 的特殊字符串,完整的格式包括格式前缀 $(字符型专用)格式名称 formatname,输出宽度w,小数点位数 d(数值型专用)等信息。完整形式如下:

<$>formatname<w>.<d>

输入/输出格式是 字符串形式的语义表达  SAS内部存储 之间的桥梁。根据SAS数据类型的不同分为字符型格式数值型格式两大类型&#xff0c;其中数值类型格式还包括用于数值&#xff0c;货币&#xff0c;日期/时间/日期时间等三个子类的格式。格式用于输入称为INFORMAT&#xff08;输入格式&#xff09;&#xff0c;用于输出称为FORMAT&#xff08;输入出格&#xff09;。

字符型格式必须在格式名前面加美元符 $ &#xff08;其实是源于英文字符串 String的首字母&#xff09; 表示&#xff0c;w表示输出的总宽度。对于数值型变量&#xff0c;还可以指定小数点后的位数d。比如&#xff1a;

l  字符型格式&#xff1a;$w.

l  数值格式&#xff1a;w.d

1) COMMAw.d       表示用逗号做千位分隔符&#xff0c;小数点

2) COMMAXw.d     表示用小数点做千位分隔符&#xff0c;逗号作小数点&#xff0c;与COMMA相反&#xff0c;用于欧洲部分国家的数值显示。

l  货币&#xff1a;

1) DOLLARw.d     表示变量按美元格式输出&#xff1a;美元符号开头&#xff0c;逗号千位分隔符&#xff0c;小数点

2) EUROw.d    表示变量按欧元格式输出&#xff1a;欧元符号&#xff0c;逗号千位分隔符&#xff0c;小数点

3) EUROXw.d        EURO相同&#xff0c;但以小数点做千位分隔符&#xff0c;逗号作小数点

运行如下代码&#xff0c;检查输出结果&#xff1a; 

data _null_;

   c&#61;"abcdefghijklmn"*14bytes;

   put "char&#61;" c;

   put "char&#61;" c $;

   put "char&#61;" c $14.;

   n&#61;1234.567890;

   put "w.d&#61;   " n 12.3;

   put " COMMAw.d&#61;" n COMMA12.3;

   put "COMMAXw.d&#61;" n COMMAX12.3;

   put "DOLLARw.d&#61;" n DOLLAR12.3;

   put "  EUROw.d&#61;" n EURO12.3;

   put " EUROXw.d&#61;" n EUROX12.3;

run; 

系统输出&#xff1a;

char&#61;abcdefghijklmn

char&#61;abcdefghijklmn

char&#61;abcdefghijklmn

w.d&#61;       1234.568

 COMMAw.d&#61;   1,234.568

COMMAXw.d&#61;   1.234,568

DOLLARw.d&#61;  $1,234.568

  EUROw.d&#61;  E1,234.568

 EUROXw.d&#61;  E1.234,568 

l  日期格式&#xff1a;

1) DATEw. 比如DATE7. 显示 16JAN17

2) MMDDYYw. 比如 MMDDYY10. 显示 01/01/1960

3) YEAR4. 显示 1960

4) NLDATE. 显示本地语言格式的日期&#xff0c;比如中文SAS上显示 2017年0122

l  时间&#xff1a;

1) TIMEw比如 TIME. 显示 22:16:27

2) NLTIME. 显示本地语言格式的时间&#xff0c;比如中文SAS上显示 17时1830

l  日期时间&#xff1a;

1) DATETIME比如 DATETIME. 显示 16JAN17:22:14:35

2) NLDATM. 显示本地语言格式的日期时间&#xff0c;比如 2017年0122 171830

data _null_;

   mydate&#61;today();

   put mydate DATE. ;

   put mydate MMDDYY.;

   put mydate YEAR.;

   mytime&#61;TIME() ;

   put mytime TIME.;

   mydt&#61;datetime();

   put mydt DATETIME.;

   put mydate NLDATE.;

   put mytime NLTIME.;

   put mydt NLDATM.;

run;

系统输出&#xff1a;

22JAN17

01/22/17

2017

17:18:31

22JAN17:17:18:31

20170122

171830

20170122 171830

结语&#xff1a;SAS 数据集是SAS 组织数据的容器&#xff0c;更上一级采用SAS 逻辑库进行组织。SAS 数据集包含描述数据的元数据部分&#xff08;表的属性以及行列定义&#xff09;&#xff0c;以及真正包含数据的观测&#xff08;数据行&#xff09;组成。不管数据是存在磁盘上&#xff0c;还是在外部数据库或应用系统中&#xff0c;在SAS 内部都统一通过逻辑库引用 进行访问&#xff0c;用户无须关注数据的存储细节&#xff0c;而是关注数据在分析层次的表达。

SAS 数据集中的观测&#xff08;表记录&#xff09;一般有三种生成方式&#xff1a; 1&#xff09; DATA 步通过内嵌数据行、基于已有的数据集、或者外部数据库/系统来生成。2&#xff09;SAS数据集通过 PROC IMPORT 或者其他 面向数据操作的PROC &#xff08;如 PROC SQL&#xff09;生成&#xff1b;3&#xff09;通过面向分析的PROC自动生成&#xff0c;一般为间数据或分析结果数据。下面我们以生成一个最简单的数据集作为本章结束&#xff0c;理解SAS数据集的结构。

libname mylib &#39;c:\temp&#39;; 

data mylib.mydata (label&#61;"This is my first data");

   length column1 $32;

   column1&#61;"The only constant is change";

   column2&#61;1234.5678;

   format column2 dollar10.2;

   label column1&#61;"This is Char column";

   label column2&#61;"This is Num column";

run;

proc contentsrun;

proc printrun;




推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 树莓派Linux基础(一):查看文件系统的命令行操作
    本文介绍了在树莓派上通过SSH服务使用命令行查看文件系统的操作,包括cd命令用于变更目录、pwd命令用于显示当前目录位置、ls命令用于显示文件和目录列表。详细讲解了这些命令的使用方法和注意事项。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
author-avatar
一夜知秋50050
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有