The little SAS book 学习笔记 第二章21211.docx
- 文档编号:10539234
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:20
- 大小:890.54KB
The little SAS book 学习笔记 第二章21211.docx
《The little SAS book 学习笔记 第二章21211.docx》由会员分享,可在线阅读,更多相关《The little SAS book 学习笔记 第二章21211.docx(20页珍藏版)》请在冰豆网上搜索。
ThelittleSASbook学习笔记第二章21211
ThelittleSASbook学习笔记第二章
(1)
第二章将你的数据放入SAS(2.1-2.11)
2.1将你的数据放入SAS的方法
你可能有各种形式的数据,包括手写在纸上、存放在电脑上、或是在数据库管理系统里,不论如何,总有一种方法可以让SAS来读取。
SAS读取的数据的方法主要有以下几种类型:
●直接输入;
●从原始数据文件中创建一个SAS数据集(creatingSASdatasetsfromrawdatafiles);
●将其他软件中的数据文件转换成SAS数据集;
●直接读取其他软件的数据集;
直接输入
●Viewtable窗口可以让你以表格形式输入数据,可以定义变量、设置属性,如name、length和type(characterornumeric).
●SAS企业向导模块,aWindowsonlyapplication,hasadataentrywindowthatisverysimilartotheViewtablewindow.AswithViewtable,youcandefinevariablesandgivethemattributes.
●SAS/FSP模块,是FullScreenProduct的简称,可以设计定制的数据输入窗口,也有检测数据输入错误的功能(TheSAS/FSPproductislicensedseparatelyfromBaseSASsoftware.)。
从原始数据文件中创建一个SAS数据集你有两种方法读取原始数据文件:
●数据步可以读取任何形式的原始数据文件,这种方法还将在2.4中详解。
●导入向导(ImportWizard)、导入过程(IMPORTprocedure)适用于UNIX、OpenVMS和Windows操作环境的简单方法,可以读取CSV(comma-separatedvalues)和其他一些限定的文件类型。
将其他软件中的数据文件转换成SAS数据集如果数据在一个软件中以某种格式存放,但需要用另一种软件分析时,就会很麻烦。
有几种方法可以将某种软件中的数据转换成SAS数据集:
●如果安装SAS/ACCESS模块,可以用导入过程(importprocedure)和导入向导(ImportWizard)将Excel、Lotus、dBase和Access文件导入SAS数据集,见2.3和2.17(?
)。
●如果没有安装,可以用存放数据的软件创建一个原始文件,并用数据步或导入过程(importprocedure)读取。
很多软件都可以创建CSV文件。
●Windows操作环境下也可以用动态数据交换技术(DynamicDataExchange,DDE),见2.18。
前提是必须有一个其他的Windows程序与SAS同时运行,再使用DDE和数据步。
直接读取其他软件的数据集
●SAS/ACCESS产品可以不用转换数据格式读取数据,并适用于大部分大部分数据库管理系统,包括ORACLE,DB2,INGRES和SYBASE(但使用方法本书没有介绍)。
●使用Excelengine和Accessengine来读取这两种类型的数据。
(SAS帮助文档)
●还有其他的一些数据引擎(dataengines)来读取数据,如SPSSengine(附录D),查找帮助文档找到适合你操作环境的所有有效engine。
2.2用Viewtable窗口输入数据
调用Viewtable窗口,在工具栏的下拉菜单中选择表编辑器(TableEditor)。
列属性窗口每一列顶部的字母是默认的变量名,右击变量名,即可打开列属性(columnattributes)窗口,设置属性之后,点击应用(apply),设置完后关闭即可。
输入数据
保存表选择文件(file)——另存为(saveas),选择一个逻辑库保存,如果想保存在新的逻辑库,点击创建新逻辑库图表(NewLibrary),输入逻辑库的名字和保存路径。
打开一个已有的表首先打开表编辑器,选择文件(file)——打开(open)。
打开之后,SAS默认的是浏览模式,如果要对数据进行编辑,则要在编辑(edit)菜单中选择编辑模式。
也可以在资源管理器窗口中双击打开一个已有的表。
其他功能其他一些功能包括排序、打印(printing)、增加和删除行、一次浏览一行(窗体视图FormView)、一次浏览多行(表视图TableView)。
图标和菜单都可以选择这些功能。
在SAS程序中使用表如下程序语句可以将表内容输出打印:
PROCPRINTDATA=Sasuser.coffee;
RUN;
2.3用导入向导(ImportWizard)读取文件
导入向导会浏览你的文件以决定变量的类型,并默认数据表的第一行存放变量名。
第一步,从文件(file)下拉菜单中选择导入数据(importdata)导入向导(ImportWizard)
第二步,从standarddatasources中选择要导入的数据类型。
以commaseparatedvalues(*.csv)为例。
点击下一步
第三步,指定要导入的文件位置,SAS默认第一行存放变量名,从第二行开始存放数据。
Options可以改变这种默认选择。
第四步,选择数据集要存放的逻辑库,并为数据集取一个名字(member)
最后,导入向导创造一个procimport语句,可以是SAS再次导入这个数据。
另外,对于一些类型的数据文件还有额外的步骤,比如MicrosoftAccess文件,你需要输入数据库名和药导入的表名,有时甚至还要输入user的ID号和密码。
在SAS程序中使用导入数据比如你将数据存放在work逻辑库,并署名为flowers,那么你可以这样来输入它:
PROCPRINTDATA=WORK.flowers;
RUN;
由于work是默认的逻辑库,所以也可以直接这样:
PROCPRINTDATA=flowers;
RUN;
2.4告诉SAS你的原始数据在哪
如果数据是原始数据(比如text,ASCII,sequential,flatfiles),那么用数据步来读取能带给你最大的灵活性。
但首先你要告诉SAS你的原始数据在哪。
原始数据可以通过文本编辑器(texteditors)或系统命令。
对PC使用者来说,原始数据没有相关联的应用程序(就像doc文件与word相关联,双击doc程序就默认调用word程序以打开),有时他们会与像MicrosoftNotepad这样的简单编辑器相关联。
内部原始数据如果直接将数据输入SAS程序中,那么数据就是SAS内部数据。
DATALINES是一个指示,告诉SAS下面跟着是数据行,直到分号结尾,这个分号可以另起一行,也可以接在数据的后面。
也可以用card代替DATALINES。
下面是一个程序,这个程序创建了一个USPRESIDENTS数据集。
(Input语句还将在2.5和2.15中讨论)
外部原始数据数据外SAS程序外部时,使用INFILE语句告诉SAS外部数据的文件名和存放路径,它在data语句之后,在INPUT语句之前。
INFILE后面的文件名和路径要用引号,各种系统的引用方式各不同:
假设有一个President.dat数据在你的C盘的MyRawData目录中,
那么可以用如下方式引用这个外部数据:
SAS日志读取外部数据时,SAS日志会给一些很有用的信息,检查这些信息可以解决一些问题,比如对比INFILE语句读取的记录数和数据集中实际观测值,可以确定SAS是否正确的读取了数据。
上面程序的日志如下图所示,
过长记录在一些操作环境中,SAS假定外部数据文件的记录长度为256或更少(记录长度是指某行中的字符数,包括空格),如果长度过长,SAS不能读取全部,此时需要在INFILE语句中使用LRECL=来指定长度,这个长度必须是数据中最长行的长度,如:
INFILE’c:
\MyRawData\President.dat’LRECL=2000;
可以通过SAS日志来查看最大记录长度。
2.5listinput读取空格分开的原始数据
如果原始数据都至少被一个空格分开,那么用listinput读取数据可能是正确的。
Listinput是一个很简单的读取数据的方式,但是会受到很多限制。
你必须读取所有的数据记录,不能跳过某些值、缺失值必须用句号“.”代替。
字符串数据不能包含空格、长度不能超过8个字符。
而且如果数据文件包含日期变量或者其他需要特别处理的变量,listinput将不再适用。
虽然很多限制,但仍有大量的文件可以用这种方式读取。
INPUT语句是数据步的一部分,它告诉SAS如何读取原始数据。
使用Listinput来写input语句:
在INPUT关键词之后列出变量名(按照变量在文件中出现的顺序),变量名长度在32个字节(含)以下,只能包含字母、下划线和数据,并必须以字母或者下划线开头。
如果变量是字符串,后面要价“$”号,值与值之间至少有一个空格,语句要以分号结束。
如:
这表明输入三个变量,其中name是字符串,age和height是数值变量。
例子你想组织一次青蛙跳跃比赛,现在你记录了每只参赛青蛙的名字、体重、和三次跳跃的距离,如果某次的跳跃距离不合格,那么就用“.”代替,数据文件ToadJump.dat形式如下:
虽然不是很整洁、但满足listinput的所有要求(字符串长度小于8个字节、不包含空格、值之间都有至少一个空格,缺失数据也用句号代替)。
Nosiy的数据溢出到第二行了,但这不影响,SAS会按照变量顺序自动跳到下一行读取。
如下是读取这个数据的SAS程序:
Input后面是变量名,ToadName是字符串变量,其他是数值变量;procprint过程用来输出数据集中所有的变量和观测值;title语句用告诉SAS输出顶部的标题,如果不指定标题,SAS将以“theSASsystem”作为标题在每一页的顶部。
输出的形式如下:
由于Noisy的数据溢出到下一行,因此下面的说明会出现在SAS日志上:
2.6columninput读取按固定列排列的原始数据
当一些原始数据的值之间没有空格分开,或者没用用句号代替缺失值时,listinput就不能用。
但当每个变量的值都出现在数据行的相同位置时,并且变量值是字符串或者标准数值(只包含数据、小数点、正负号、和科学标注的E。
逗号和日期都不能算)时,可以使用columninput来读取。
相比listinput,columninput有如下优势:
●不要求变量值之间的空格;
●缺失值可以直接用空格代替;
●字符串中可以包含空格;
●可以跳过不需要的变量。
调查数据使用columninput,因为调查答案的记录都是用单个数字(0-9),如果每个答案之间再用空格分开,就会使整个文件会扩大两倍。
有地址的数据文件也使用columninput,因为地址之中常常包含空格,比如街道MartinLutherKingJr.Boulevard在columninput中就可以当成一个变量而不是五个。
可能用columninput读取的数据也可以用formattedinput读取或者几种方式组合。
Columninput的input语句格式如下:
input关键字后接变量名、再接变量的列位置(列位置是字符或者数值在一行中的位置)。
字符串变量名后仍要用“空格+$”,变量名之间仍要用空格隔开。
示例如下:
这个语句表明,Name变量,在行中占据第1列第10列,为字符串变量,age占据第11-13列,为数值变量,height占据第14-18列,数值变量。
例子原始数据记录如下:
读取这个数据的columninput程序如下:
第一个变量visitingteam占据第1-20列,为字符变量;concessionsales占据第21-24列,为数值变量,下面几个变量均占据固定的列。
输出结果如下:
2.7informats读取非标准格式的原始数据
有时候原始数据不全是字符串或者数值,比如类似1,00,001这样包括逗号的字符串值,电脑就不能读取,其他诸如包含美元符号、十六进制、压缩十进制的数据都是非标准数据。
SAS中,informats可以用来告诉电脑如何读取这样的数值。
日期是最普通的非标准数据,SASinformats会把类似10-31-2003或者31OCT03转换成数字,日期的起点为1960年1月1日,即这一天的数字为0。
Informats的三种普遍格式为:
字符串、数值、日期。
这三种格式的形式如下:
$代表是字符串、informats代表形式(比如日期的MMDDYY)、w是宽度、d是小数点的位数、最后是句号“.”,缺少句号会使得SAS把形式(如MMDDYY)当做变量名。
一个简单formattedinput的简单INPUT语句如下:
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可选择变量形式
一般使用的变量形式的定义,以及它们的宽度范围和默认宽度如下:
2.9混合读取方式
每种数据读取方式都有其优势,list最简单,column和formatted虽然复杂但是不要求变量之间的空格,并且变量名中可以包含变量,而且formatted可以读取特殊的数据比如日期。
SAS可以灵活的让你搭配不同的读取方式,以达到最大的方便。
例子如下的原始数据记录了美国国家公园的信息:
姓名(name)、所属周(state)、建立时间(yearestablished)、占地面积(sizeinacre):
有多种方式进行数据读取,下面的程序是方式之一:
其中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’列指示器和colonmodifier。
@’character’列指示器2.9中提到@column列指示器可以让SAS直接从某列开始读取数据。
但有时候你不知道要读取的数据是从哪列开始,此时你只要知道要读取的数据的前面那个字符或单词即可。
比如有一个关于狗的原始文件,你想要读取狗的品种号,但文件排列很凌乱,只知道品种号跟随在单词breed后面,那么可以用如下方式读取:
Input@’Breed:
’DogBreed$;
colonmodifier由于input读取字符串变量默认为8个字符,因此在上例中如果狗的品种名(dogbreed)超过8个字符,则需要定义长度,定义为$length,在该长度中,空格也算在内。
如果要使SAS读取过程中遇到空格则不再继续读取,则要在$length前面加冒号“:
”。
比如原始数据中有这么一行:
MydogSamBreed:
RottweilerVetBills:
$478
如果用上述不同方法读取,会有不同结果:
例子web日志是凌乱数据的一个很好例子,下面是一个网站的web日志,数据开始于访问IP,后面有访问日期、访问文件名等信息。
现在想要读取访问日期和访问的文件名,但是它们每行中所占据的列的位置都不同,而且文件名的长度每行都不一样,那么SAS读取这种文件通过如下方式:
@’[’作为列指示器,告诉SAS读取[之后的内容,@’GET’告诉SAS读取GET之后的内容,由于文件名作为字符串变量,这里基本都会超过8个字节,因此后面附加:
$20。
输出结果如下:
2.11跨行观测值的读取方式
一般原始文件中一行代表一个观测值,有时会出现一个观测值跨行的情况。
由于SAS会自动转到下一行读取数据,直到读取这个观测的所有变量(input语句中给出),所以你需要告诉SAS什么时候不要换行,以便在日志中不出现SAS-went-to-a-new-line的暂停说明,此时需要在INPUT语句中加行指示器。
(?
?
?
?
)
行指示器,斜线/:
告诉SAS跳至原始数据的第二行;#n:
跳至第n行,n代表原始数据中某观测值的行数(#2则让SAS跳至某观测值的第二行),#n不能用来回跳。
例子有一组关于温度的数据,temperature.dat第一行代表城市和州,第二行代表本日最高温和最低温,第三行代表史上最高温和最低温。
用如下的程度来读取这份数据:
Input后面告诉SAS读取第一行的city变量和state变量,斜线/告诉SAS移动到下一行的第一列,以便读取normalhigh和normallow。
#3告诉SAS移动到第三行的第一列以便继续读取观测值的recordhigh变量和recordlow变量。
这里/可以用#2代替,也可以用/代替#3。
日志记录如下:
从日志中可以看出,虽然原始原件占了9行,但只有三个观测值。
输出结果如下:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- The little SAS book 学习笔记 第二章21211 学习 笔记 第二 21211
![提示](https://static.bdocx.com/images/bang_tan.gif)