文章目录
第一章 SAS 软件入门
1.1SAS 语言
- SAS 程序就是一个按顺序执行的语句序列,一个语句给 SAS 下达信息和指令,且必须要正确的安放
- 每一个 SAS 语句都由一个分号结尾
- SAS 程序布局:
- 不区分大小写。
- 一条语句可以持续到第二行(只要不把一个单词分开)
- 几条语句可以用一行
- 可以在任何一列中开始一条语句
- 注释的方法:
- 是星号和;号;
- 一种是用/* */表示,不能放在第一列
1.2SAS 数据集
- 变量和观测值:SAS 数据集也被叫做表、观测值也被叫做行、变量也被叫做列
- 数据类型:只有两种数据类型——数值型和字符型
- 数值型完全是数据,可以被加减乘除、可以是正负且是小数
- 字符变量是
除数值之外的类型,可以是数值、字母、和一些特殊的字符(¥、!),最多可以占用 32767
个字节长度 - 如果一个变量既包括数字又包括字符,那么它一定是字符变量。如果只包括数字,可能是字
符变量也可能是数值变量
- 缺失值
- 字符变量的缺失值用空格表示,
- 数值变量的缺失值用句号(.)表示
- SAS 数据集的大小
- SAS 命名规则
- 名字的长度要小于等于 32 个字节
- 以字母或下划线开头
- 可以包含字母、数字、或者是下划线,不能是%$!*&#@
- 可以是小写或大写字母,且不区分大小写
- SAS 数据集储存的文件
1.3 SAS 程序的两个过程
- SAS 程序有两个基本模块:数据步和过程步
- 由数据步创建 SAS 数据集开始,再由过程步分析数据
- 记住数据步负责读取、修改数据,过程步负责分析数据、输报告和效用函数
- 数据步由 DATA 语句开始:data+数据名
- 为了读取外部数据、未加工的数据,数据步提供了 DO LOOPS,IF-THEN/ELSE,以及一些数值和字符函数。数据步也可以按照你想要的方式合并数据集,包括联接(concatenation)和合并(match-merge)
- 过程步由 proc 语句开始 proc+过程名(print、sort、means…)
- SAS 过程步可以处理从数据储存、输出到方差分析、3D 图表的一切操作
- 当遭遇 DATA\PROC 等标志着新程序开始的语句时,程序结束。如果运行的是批处理,则 run 代表语句的结束。当 proc 出现时,代表 data 过程结束。
- 典型的程序是以 DATA 语句开头,输入或修改数据,然后将数据传递给 PROC 语句。可用任何顺序来排列 data 和 proc 两者
的顺序,一个程序甚至可以仅有 data 语句或 proc 语句。 - data 语句和 proc 语句的一些基本不同点:
1.4 数据步的内置循环
- 数据步按照一行一行、一个观测值一个观测值的顺序执行
1.5 选择一个提交程序的方式
- SAS 视窗环境
- SAS 企业向导
- 非交互式模式
- 批处理或后台模式
- 远程提交
- 交互行模式
1.6 SAS 视窗环境中的视窗和命令
- SAS 视窗
- 五种基本的视窗(窗口):结果视窗、资源管理器视窗、和三种程序视窗:程序编辑、日志、输出
- 五种基本的视窗(窗口):结果视窗、资源管理器视窗、和三种程序视窗:程序编辑、日志、输出
- SAS 命令 :为了不同的任务,你有三种方式发出命令:菜单、工具栏、SAS 命令栏
1.7 在 SAS 视窗环境中提交程序
- 将你的程序放入编辑窗口中
- 提交你的程序
- 访问 SAS 日志和输出 提交程序后,日志窗口和输出窗口会有相应的日志和结果显示,如果你使用的是增强型编辑窗口,之前的程序会保留,如果使用的是程序编辑窗口,之前的程序不会保留。
- 取回你的程序:需要再次运行时,对于程序编辑窗口,由于之前的程序不在保留,因此需要调回命令(recall),有两种方法:
1.8 阅读 SAS 日志
1.9 输出窗口中浏览结果
1.10 创建 HTML 输出
- 如果使用的是 SAS 视窗环境,那么可以为结果创建超文本标记语言(HTML)格式。
1.11 SAS 数据的逻辑库
1.12 用 SAS 资源管理器访问 SAS 数据集
1.13 使用 SAS 系统选项
- 四种方法可以指定系统选项的参数,SAS 帮助文档会告诉你哪种适合你的操作系统
- 1系统管理员会创建一个包含了系统选项设定的配置文件,每次 SAS 启动时都会访问这个文件。
-2 在启动 SAS 之后,根据系统提示指定系统选项 - 3如果使用 SAS 视窗环境,可以从 SAS 系统选项中改变已选择的选项
- 4使用 OPTIONS 语句
- OPTIONS 语句是 SAS 程序的一部分,并可影响之后的所有语句。
- 由OPTIONS关键词开头,后面是相关选项:OPTIONS LINESIZE=80 NODATE
- OPTIONS 语句既不属于数据步也不属于过程步,这个全局变量可以出现在程序的任何部分,但放在开头最有意义,你可以很容易看到哪些选项在发挥作用。
- 方法3,4最好。
- 1系统管理员会创建一个包含了系统选项设定的配置文件,每次 SAS 启动时都会访问这个文件。
第二章将你的数据放入 SAS
2.1 将你的数据放入 SAS 的方法
- 1直接输入;
- Viewtable 窗口以表格形式输入数据,可以义变量、设置属性,如 name、length和 type(character or numeric
- SAS 企业向导模块
- SAS/FSP 模块 Full Screen Product 的简称,设计定制的数据输入窗口,检测数据输入错误
- 2从原始数据文件中创建一个 SAS 数据集(creating SAS data sets from raw data files);
- 数据步可读取任何形式的原始数据文件,这种方法还将在 2.4 中详解。
- 导入向导(Import Wizard)、导入过程(IMPORT procedure)适用于 UNIX、OpenVMS 和Windows 操作环境的简单方法,可以读取 CSV(comma-separated values)和其他一些限定的文件类型
- 3将其他软件中的数据文件转换成 SAS 数据集;
- 如果安装 SAS/ACCESS 模块,可以用导入过程(import procedure)和导入向导(Import Wizard)将 Excel、Lotus、dBase 和 Access 文件导入 SAS 数据集,见 2.3 和 2.17
- 如果没有安装,可以用存放数据的软件创建一个原始文件,并用数据步或导入过程(import procedure)读取。很多软件都可以创建 CSV 文件
- Windows 操作环境下也可以用动态数据交换技术(Dynamic Data Exchange,DDE),见2.18。前提是必须有一个其他的 Windows 程序与 SAS 同时运行,再使用 DDE 和数据步
- 4 直接读取其他软件的数据集;
- SAS/ACCESS 产品可以不用转换数据格式读取数据,并适用于大部分大部分数据库管理
系统,包括 ORACLE,DB2,INGRES 和 SYBASE(但使用方法本书没有介绍)。 - 使用 Excel engine 和 Access engine 来读取这两种类型的数据。(SAS 帮助文档)
- 还有其他的一些数据引擎(data engines)来读取数据,如 SPSS engine(附录 D),查找
帮助文档找到适合你操作环境的所有有效 engine。
- SAS/ACCESS 产品可以不用转换数据格式读取数据,并适用于大部分大部分数据库管理
2.2 用 Viewtable 窗口输入数据
- 调用 Viewtable 窗口,在工具栏的下拉菜单中选择表编辑器(Table Editor)。
- 列属性窗口
- 输入数据
- 保存表
- 打开一个已有的表
- 其他功能:括排序、打印(printing)、增加和删除行、一次浏览一行(窗体视图 Form View)、一次浏览多行(表视图 Table View)
- 在 SAS 程序中使用表:
proc print DATA =Sasuser.coffee;
run;
2.3 用导入向导(Import Wizard)读取文件
2.4告诉 SAS 你的原始数据在哪
- 内部原始数据
- 直接将数据输入 SAS 程序中,那么数据就是 SAS 内部数据
- DATALINES是一个指示,告诉 SAS 下面跟着是数据行,直到分号结尾,这个分号可以另起一行,也可以接在数据的后面。也可以用 card 代替 DATALINES.
- 外部原始数据
- 数据外 SAS 程序外部时,使用 INFILE 语句告诉 SAS 外部数据的文件名和存放路径,它在 data 语句之后,在 INPUT 语句之前。INFILE 后面的文件名和路径要用引号,各种系统的引用方式各不同:
- SAS 日志
- 过长记录:LRECL
INFILE’c:\MyRawData\President.dat’LRECL=2000;
2.5 list input 读取空格分开的原始数据
- 限制:必须读取所有的数据记录,不能跳过某些值、缺失值必须用句号“.”代替。字符串数据不能包含空格、长度不能超过 8 个
字符。不适用于数据文件包含日期变量或者其他需要特别处理的变量 - 在 INPUT 关键词之后列出变量名(按照变量在文件中出现的顺序),变量名长度在 32个字节(含)以下,只能包含字母、下划线和数据,并必须以字母或者下划线开头。如果变量是字符串,后面要价“$”号,值与值之间至少有一个空格,语句要以分号结束。
INPUT Name $ Age Height
2.6 column input 读取按固定列排列的原始数据
-
当每个变量的值都出现在数据行的相同位置时,并且变量值是字符串或者标准数值(只包含数据、小数点、正负号、和科学标注的 E。逗号和日期都不能算)时,可以使用 column input 来读取。
-
相比 list input,column input 有如下优势:
- 不要求变量值之间的空格
- 缺失值可以直接用空格代替
- 字符串中可以包含空格
- 可以跳过不需要的变量
-
原始数据:
DATA sales;
INFILE 'G:\SAS\Sasdata\columninput.txt';
INPUT VisitingTeam $ 1-20 ConcessionSales 21-24 BleacherSales 25-28 OurHits 29-31 TheirHits 32-34 OurRuns 35-37 TheirRuns 38-40;
PROC PRINT DATA = sales;
TITLE 'SAS Data Set Sales';
RUN;
- 结果:
- 解释:原始表间有空格,表示读取1-20的位置的数,21-24位置的数,25-28位置的数,没有空格会导致读取不出来
2.7 informats 读取非标准格式的原始数据
- 当数据不全是字符串或者数值,
- 如类似 1,00,001 这样包括逗号的字符串值
- 美元符号、十六进制、压缩十进制
- 日期是最普通的非标准数据,
- Informats 的三种普遍格式为:字符串、数值、日期
- $代表是字符串、informats 代表形式(比如日期的 MMDDYY)、w 是宽度、d 是小数点的位数、
最后是句号“.”,缺少句号会使得 SAS 把形式(如 MMDDYY)当做变量名
- $代表是字符串、informats 代表形式(比如日期的 MMDDYY)、w 是宽度、d 是小数点的位数、
- 格式:
INPUT Name $ 10. Age 3 . Height 5.1 BirthDate MMDDYY10.;
- 解释:Name 为字符串变量,占据 10 个宽度,即列位置从 1-10;age 为数值变量,占据 3 个宽度,列位置从 11 到 13;height 也为数值变量,占据 5 个宽度,包括了 1 位小数点和小数点本身,列位置从 14-18(如 150.3);最后是日期变量,从第 19 列开始,形式为 MMDDYY
- 例子:
因为手动数着空格敲数据 ,所以只敲了一行
DATA context;
INFILE 'G:\SAS\Sasdata\informats.txt';
INPUT Name $16. Age 3. +1 Type $1. +1 Date MMDDYY10. (Score1 Score2 Score3 Score4 Score5)(4.1);
PROC PRINT DATA = context;
TITLE 'SAS Data Set Sales';
RUN;
- 结果:
- 解释:
年龄后面的+1 代表跳过一列,即原始数据中年龄后面有一个空格。最后的 5 个变量score1-score5,都要求有同样的形式,4.1。将变量名和形式分别放在两个括号集中,可以一次性定义很多变量
2.8 可选择变量形式
一般使用的变量形式的定义,以及它们的宽度范围和默认宽度如下:
2.9 混合读取方式
- list 最简单,column 和 formatted 虽然复杂但是不要求变量之间的空格,并且变量名中可以包含变量,而且 formatted 可以读取特殊的数据比如日期
- 数据
DATA nationalparks;
INFILE 'G:\SAS\Sasdata\formatted.txt';
INPUT ParkName $ 1-22 State $ Year @40 Acreage Comma9.;
PROC PRINT DATA = nationalparks;
TITLE 'Selected National Parks';
RUN;
- 结果
- 解释
- ParkName 是 column 方式读取,State 和 Year 是 list 方式读取,Acreage 是 formatted 方式读取
- 混合读取方式有时会遇到问题:SAS 通过一个指示器标注位置,来读取原始数据的一行,但每种读取方式对指示器的使用稍有不同。List 方式下,SAS 自动找到非空格区域并开始读取;column 方式下,SAS 读取你所指定的特定位置;informatted 方式下,SAS 不理会指示器的标准,只是依次的读取。这时,就会需要列指示器@n,来人为的让 SAS 的读取直接跳至某列。在上面的程序中,列指示器@40 告诉 SAS 在读取 Acerage 变量之前,移动到第 40 列去
- Comma9 告诉 SAS 读取 9 列,SAS 就会读取包括空格在内的 9 列,这便会导致输出结果的问
题。
2.10 读取凌乱的原始数据
数据排列混乱,长度不一:
- @’character’ 列指示器:
- 只知道品种号跟随在单词 breed 后面
- 格式:
Input @’Breed:’ DogBreed $;
- 只知道品种号跟随在单词 breed 后面
- colon modifier
- input 读取字符串变量默认为 8 个字符;
- 名(dogbreed)超过 8 个字符,则需要定义长度,定义为 length 前面加冒号“:”
My dog Sam Breed:Rottweiler Vet Bills:$478
- 例子
- 数据
DATA weblogs;
INFILE 'G:\SAS\Sasdata\2.10.txt';
INPUT @ '[' AccessDate DATE11. @'GET' File :$20.;
PROC PRINT DATA = weblogs;
TITLE 'Dog Care Web Logs';
RUN;
- 结果
- 解释:
@’[’作为列指示器,告诉 SAS 读取[之后的内容,@’GET’告诉 SAS 读取 GET 之后的内容,由于文件名作为字符串变量,这里基本都会超过 8 个字节,因此后面附加:$20。
2.11 跨行观测值的读取方式
- 说明:
- 行指示器,斜线/:告诉 SAS 跳至原始数据的第二行
- #n:跳至第 n 行,n 代表原始数据中某观测值的行数(#2 则让 SAS 跳至某观测值的第二行),#n 不能用来回跳
- 例子
- 数据
Nome AK
55 44
88 29
Miami FL
90 75
97 65
Raleigh NC
88 68
105 50
DATA highlow;
INFILE 'G:\SAS\Sasdata\211.txt';
INPUT City $ State / NormalHigh Normallow
#3 RecordHigh Recordlow;
PROC PRINT DATA = highlow;
TITLE 'High and low tenperatures for JULY';
RUN;
- 结果:
- Input 后面告诉 SAS 读取第一行的 city 变量和 state 变量,斜线/告诉 SAS 移动到下一行的第一列,以便读取 normalhigh 和 normallow。#3 告诉 SAS 移动到第三行的第一列以便继续读取观测值的 recordhigh 变量和 recordlow 变量。这里/可以用#2 代替,也可以用/代替#3。
2.12 一行有多个观测值的原始文件读取
- 当一行出现多个观测值时,可以在 input 语句结尾加一个停止符号@@
- 如导入:
Nome AK 2.5 15 Miami FL 6.75
18 Raleigh NC . 12
- 如导入:
DATA rainfall;
INFILE 'C:\Users\37596\Desktop\sas.dat';
INPUT City $ State $ Normation MeanDaysRain @@;
proc PRINT DATA = rainfall;
TITLE 'Normal Total Precipitation and';
TITLE2 'Mean Days with Precipitation for July';
RUN;
结果:
2.13 读取原始数据的部分观测值
- 在 SAS 读取某一行观测值时,首先读取足够的变量以便决定是否需要保留此行的观测值。然后在 input 语句结尾加符号@,叫做 a trailing at(called a trailing at),这告诉 SAS 先停在(hold)此行,同时用 IF语句检测此观测值是否满足需要,如果是,那么可以再用一个 input 语句来读取现有的变量.
- 例子:只需要freeway的数据
原数据:
* use a trailing @ ,then delete surface streets;
DATA freeways;
INFILE 'D:\SAS learnning\traffic.dat';
INPUT Type $ @;
IF Type ='surface' THEN DELETE;
INPUT Name $ 9-38 AMTraffic PMTraffic;
PROC PRINT DATA = freeways;
TITLE 'Traffic for Freeways';
RUN;
第一个 input 读取字符串变量,@是 SAS 停留在观测值上并用 IF 检测,第二个 input 读取 input后面的变量值结果
疑问:9-38 什么意思??
结果:
- @ vs @@
- @的作用类似于@@,都是行停留指示符(line-hold specifiers),不同地方在于停留多久
- @能使 SAS 停留到下一个 input 语句(也不换行),
- @@能使停留的时间到下一个data 步(也不换行)
例子:
data test;
infile cards;
input x @;
input y;
input z @@;
cards;
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17
;
proc print data=test;
run;
结果:
解释:
x取1 有一个@,不换行;故y接着读入2,y后没有@则换行,z读入7,z后两个@@不换行,x接着读入8,同理,不换行y读入9,换行z读入13.