1、The little SAS book 学习笔记 第二章 将你的数据放入 SAS 2.1 将你的数据放入 SAS 的方法 你可能有各种形式的数据,包括手写在纸上、存放在电脑上、或是在数据库管理系统里,不论如何,总有一种方法可以让 SAS 来读取。 SAS 读取的数据的方法主要有以下几种类型: 直接输入; 从原始数据文件中创建一个 SAS 数据集( creating SAS data sets from raw data files); 将其他软件中的数据文件转换成 SAS 数据集; 直接读取其他软件的数据集; 直接输入 View table 窗口可以让你以表格形式输入数据,可以定义变量、设置属
2、性,如 name、 length和 type(character or numeric). SAS 企业向导模块, a Windows only application, has a data entry window that is very similar to the View table window. As with View table, you can define variables and give them attributes. SAS/FSP 模块,是 Full Screen Product 的简称,可以设计定制的数据输入窗口,也有检测数据输入错误的功能( The SA
3、S/FSP product is licensed separately from Base SAS software.)。 从原始数据文件中创建一个 SAS 数据集 你有两种方法读取原始数据文件: 数据步可以读取任何形式的原始数据文件,这种方法还将在 2.4 中详解。 导入向导( Import Wizard)、导入过程( IMPORT procedure)适用于 UNIX、 OpenVMS和 Windows 操作环境的简单方法,可以读取 CSV( comma-separated values)和其他一些限定的文件类型。 将其他软件中的数据文件转换成 SAS 数据集 如果数据在一个软件中以某种
4、格式存放,但需要用另一种软件分析时,就会很麻烦。有几种方法可以将某种软件中的数据转换成 SAS 数据集: 如果安装 SAS/ACCESS 模块,可以用导入过程( import procedure)和导入向导( Import Wizard)将 Excel、 Lotus、 dBase 和 Access 文件导入 SAS 数据集,见 2.3 和 2.17(?)。 如果没有安装,可以用存放数据的软件创建一个原始文件,并用数据步或导入过程( import procedure)读取。很多软件都可以创建 CSV文件。 Windows 操作环境下也可以用动态数据交换技术( Dynamic Data Excha
5、nge, DDE),见2.18。前提是必须有一个其他的 Windows 程序与 SAS 同时运 行,再使用 DDE和数据步。 直接读取其他软件的数据集 SAS/ACCESS 产品可以不用转换数据格式读取数据,并适用于大部分数据库管理系统,包括 ORACLE,DB2,INGRES 和 SYBASE(但使用方法本书没有介绍)。 使用 Excel engine 和 Access engine 来读取这两种类型的数据。( SAS 帮助文档) 还有其他的一些数据引擎( data engines)来读取数据,如 SPSS engine(附录 D),查找帮助文档找到适合你操作环境的所有有效 engine。
6、2.2 用 View table 窗口输入数据 调用 View table 窗口,在工具栏的下拉菜单中选择表编辑器( Table Editor)。 列属性窗口 每一列顶部的字母是默认的变量名,右击变量名,即可打开列属性( column attributes)窗口,设置属性之后,点击应用( apply),设置完后关闭即可。 输入数据 保存表 选择文件( file) 另存为( save as),选择一个逻辑库保存,如果想保存在新的逻辑库,点击创建新逻辑库图表( New Library),输入逻辑库的名字和保存路径。 打开一个已有的表 首先打开表编辑器,选择文件( file) 打开( open)。打
7、开之后, SAS 默认的是浏览模式,如果要对数据进行编辑,则要在编辑( edit)菜单中选择编辑模式。也可以在资源管理器窗口中双击打开一个已有的表。 其他功能 其他一些功能包括排序、打印( printing)、增加和删除行、一次浏览一行( 表单 视图 Form View)、一次浏览多行(表视图 Table View)。图标和菜单都可以选择这些功能。 在 SAS 程序中使用表 如下程序语句可以将表内容输出打印: PROC PRINT DATA=Sasuser.coffee; RUN; 2.3 用导入向导( Import Wizard)读取文件 导入向导会浏览你的文件以决定变量的类型,并默认数据表
8、的第一行存放变量名。 第一步,从文件( file)下拉菜单中选择导入数据( import data)导入向导( Import Wizard) 第二步,从 standard data sources 中选择要导入的数据类型。以 comma separated values( *.csv)为例。点击下一步 第三步,指定要导入的文件位置, SAS 默认第一行存放变量名,从第二行开始存放数据。 Options 可以改变这种默认选择。 第四步,选择数据集要存放的逻辑库,并为数据集取一个名字( member) 最后,导入向导创造一个 proc import 语句,可以是 SAS 再次导入这个数据。 另外,
9、对于一些类型的数据文件还有额外的步骤,比如 Microsoft Access 文件,你需要输入数据库名和药导入的表名,有时甚至还要输入 user 的 ID 号和密码。 在 SAS程序中使用导入数据 比如你将数据存放在 work逻辑库,并署名为 flowers,那么你可以这样来输入它: PROC PRINT DATA=WORK.flowers; RUN; 由于 work 是默认的逻辑库,所以也可以直接这样: PROC PRINT DATA=flowers; RUN; 2.4 告诉 SAS 你的原始数据在哪 如果数据是原始数据(比如 text, ASCII, sequential, flat fi
10、les),那么用数据步来读取能带给你最大的灵活性。但首先你要告诉 SAS 你的原始数据在哪。 原始数据可以通过文本编辑器( text editors)或系统命令。对 PC 使用者来说,原始数据没有相关联的应用程序(就像 doc 文件与 word 相 关联,双击 doc 程序就默认调用 word程序以打开),有时他们会与像 Microsoft Notepad 这样的简单编辑器相关联。 内部原始数据 如果直接将数据输入 SAS 程序中,那么数据就是 SAS 内部数据。DATALINES 是一个指示,告诉 SAS 下面跟着是数据行,直到分号结尾,这个分号可以另起一行,也可以接在数据的后面。也可以用
11、card 代替 DATALINES。下面是一个程序,这个程序创建了一个 USPRESIDENTS 数据集。( Input 语句还将在 2.5 和 2.15 中讨论) 外部原始数据 数据外 SAS 程序外部时,使用 INFILE 语句告诉 SAS 外部数据的文件名和存放路径,它在 data 语句之后,在 INPUT 语句之前。 INFILE 后面的文件名和路径要用引号,各种系统的引用方式各不同: 假设有一个 President.dat 数据在你的 C 盘的 MyRawData 目录中, 那么可以用如下方式引用这个外部数据: SAS 日志 读取外部数据时, SAS 日志会给一些很有用的信息,检查这
12、些信息可以解决一些问题,比如对比 INFILE 语句读取的记录数和数据集中实际观测值,可以确定 SAS是否正确的读取了数据。上面程序的日志如下图所示, 过长记录 在一些操作环境中, SAS 假定外部数据文件的记录长度为 256 或更少(记录长度是指某行中的字符数,包括空格),如果长度过长, SAS 不能读取全部,此时需要在INFILE 语句中使用 LRECL=来指定长度,这个长度必须是数据中最长行的长度,如: INFILE c:MyRawDataPresident.dat LRECL=2000; 可以通过 SAS 日志来查看最大记录长度。 2.5 list input 读取空格分开的原始数据
13、如果原始数据都至少被一个 空格分开,那么用 list input 读取数据可能是正确的。 List input 是一个很简单的读取数据的方式,但是会受到很多限制。你必须读取所有的数据记录,不能跳过某些值、缺失值必须用句号 “ .” 代替。字符串数据不能包含空格、长度不能超过 8个字符。而且如果数据文件包含日期变量或者其他需要特别处理的变量, list input 将不再适用。虽然很多限制,但仍有大量的文件可以用这种方式读取。 INPUT 语句是数据步的一部分,它告诉 SAS 如何读取原始数据。使用 List input 来写input 语句:在 INPUT 关键词之后列出变量名(按照变量在文件
14、中出现的顺序),变量名长度在 32 个字节(含)以下,只能包含字母、下划线和数据,并必须以字母或者下划线开头。如果变量是字符串,后面要价 “ $” 号,值与值之间至少有一个空格,语句要以分号结束。如: 这表明输入三个变量,其中 name 是字符串, age 和 height 是数值变量。 例子 你想组织一次青蛙跳跃比赛,现在你记录了每只参赛青蛙的名字、体重、和三次跳跃的距离,如果某次的跳跃距离不合格,那么就用 “ .” 代替,数据文件 ToadJump.dat形式如下: 虽然不是很整洁、但满足 list input 的所有要求(字符串长度小于 8 个字节、不包含空格、值之间都有至少一个空格,缺
15、失数据也用句号代替)。 Nosiy 的数据溢出到第二行了,但这不影响, SAS 会按照变量顺序自动跳到下一行读取。如下是读取这个数据的 SAS 程序: Input 后面是变量名, ToadName 是字符串变量,其他是数值变量; proc print 过程用来输出数据集中所有的变量和观测值; title 语句用告诉 SAS 输出顶部的标题,如果不指定标题, SAS 将以 “ the SAS system” 作为标题在每一页的顶部。输出的形式如下: 由于 Noisy 的数据溢出到下一行,因此下面的说明会出现在 SAS 日志上: 2.6 column input 读取按固定列排列的原始数据 当一些
16、原始数据的值之间没有空格分开,或者没用用句号代替缺失值时, list input 就不能用。但当每个变量的值都出现在数据行的相同位置时,并且变量值是字符串或者标准数值(只包含数据、小数点、正负号、和科学标注的 E。逗号和日期都不能算)时,可以使用column input 来读取。 相比 list input, column input 有如下优势: 不要求变量值之间的空格; 缺失 值可以直接用空格代替; 字符串中可以包含空格; 可以跳过不需要的变量。 调查数据使用 column input,因为调查答案的记录都是用单个数字( 0-9),如果每个答案之间再用空格分开,就会使整个文件会扩大两倍。有
17、地址的数据文件也使用 column input,因为地址之中常常包含空格,比如街道 Martin Luther King Jr.Boulevard 在 column input中就可以当成一个变量而不是五个。可能用 column input 读取的数据也可以用 formatted input读取或者几种方式组合。 Column input 的 input 语句格式如下: input 关键字后接变量名、再接变量的列位置(列位置是字符或者数值在一行中的位置)。字符串变量名后仍要用 “ 空格 +$” ,变量名之间仍要用空格隔开。示例如下: 这个语句表明, Name 变量,在行中占据第 1 列第 10
18、 列,为字符串变量, age 占据第11-13 列,为数值变量, height 占据第 14-18 列,数值变量。 例子 原始数据记录如下: 读取这个数据的 column input 程序如下: 第一个变量 visitingteam 占据第 1-20 列,为字符变量; concessionsales 占据第 21-24 列,为数值变量,下面几个变量均占据固定的列。输出结果如下: 2.7 informats 读取非标准格式的原始数据 有时候原始数据不全是字符串或者数值,比如类似 1,00,001这样包括逗号的字符串值,电脑就不能读取,其他诸如包含美元符号、十六进制、压缩十进制的数据都是非标准数据
19、。SAS 中, informats 可以用来告诉电脑如何读取这样的数值。 日期是最普通的非标准数据, SAS informats 会把类似 10-31-2003 或者 31OCT03 转换成数字,日期的起点为 1960 年 1 月 1 日,即这一天的数字为 0。 Informats 的三种普遍格式为:字符串、数值、日期。这三种格式的形式如下: $代表是字符串、 informats 代表形式(比如日期的 MMDDYY)、 w 是宽度、 d 是小数点的位数、最后是句号 “ .” ,缺少句号会使得 SAS 把形式(如 MMDDYY)当做变量名。一个简单 formatted input 的简单 INP
20、UT 语句如下: Name 为字符串变量,占据 10 个宽度,即列位置从 1-10; age 为数值变量,占据 3 个宽度,列位置从 11 到 13; height 也为数值变量,占据 5 个宽度,包括了 1 位小数点和小数点本身,列位置从 14-18(如 150.3);最后是日期变量,从第 19 列开始,形式为 MMDDYY。 例子 原始数据如下: 读取这个数据的 informat 程序如下: 年龄后面的 +1 代表跳过一列,即原始数据中年龄后面有一个空格。最后的 5 个变量score1-score5,都要求有同样的形式, 4.1。将变量名和形式分别放在两个括号集中,可以一次性定义很多变量。输出结果如下: 2.8 可选择变量形式 一般使用的变量形式的定义,以及它们的宽度范围和默认宽度如下: