sas学习入门

sas学习入门
sas学习入门

第一章SAS入门

第一节简介

SAS是分析数据的软件工具,其提供的程序(procedure)可供分析者以简短的叙述,快速的从数据中颉取到所需的信息。SAS的DATA步骤所用的程序语法非常的简捷且具弹性,分析者可依自己的思绪安排数据, 于数据间畅行无阻。使用SAS软件统计、分析和颉取数据时,SAS系统处理所有大小事,遇到特殊先进的分析方法或欲作方法学研究,当系统没有提供适当的程序时,分析者可用其极具弹性的程序语法自由发辉。分析者只要安排好自己的思绪即可。

常用到的SAS软件有BASE和STAT(统计)两部份。可依需求附加绘图、预测、数据输入、数据库、联机接口等功能,扩展成一更完整的数据分析、展现、应用系统。

目前院内所使用的SAS版本,依操作系统区分有OS 6.04,WIN 6.12,OS2 和UNIX 6.12版。SAS系统在不同作业系下所使用的程序语法是相同的,些许差别在各系统下的档案管理格式,其余的程序语法都是相同的,因而SAS程序的可移植性是相文件高的。在考虑处理的数据量和系统环境使用的方便性,使用者可自行考虑在那个作业平台执行SAS程序。笔者就常在不同系统下转换SAS 程序或利用联机程序在不同操作系统下综合处理一件工作。

基础的SAS系统可有下列用途:

1. 数据储存与存取。

2. 数据编修和程序设计。

3. 编制报表。

4. 基础统计分析。

5. 档案管理。

而统计STAT部份,则提供一些较为复杂的统计,如回归、多变量、生命统计等统计程序。

第二节操作环境

SAS在不同的作业环境,其语法是相同的,其操作大环境也是类似的。先前使用SAS系统大部分是将程序备妥,而后以命令方式让系统运作,属于批次性的操作方式,这种方式在各不同的操作系统下是相通的,只要会选写SAS程序就能使SAS系统运作分析了,根本不必理会作业环境的差异。

当今各种操作系统皆提供图形接口,操作接口和处理速度的加强,促使现今分析资料可以使用交互式的操作方式来分析和展现数据,既要方便就要多学点操作系统的操作了。

第三节简单范例

在你准备执行的SAS工作平台上,启动SAS系统,将程序1-1 键入PROGRAM EDI T窗口中,依工作平台而异,请点选SUBMIT功能或在COMMAND LINE下SUBMIT指令,即可执行程序。

程序执行完毕后,先检视LOG窗口,可看到LOG1-1 内容,因操作系统和使用者不同,LOG窗口的内容会有些差异,但告知的重要讯息是相同的。

是否看到LOG1-1的讯息,那恭喜了,你己经会执行SAS且有结果产生。上面讯息告知WORK.BASE有5个观测值和三个变项,计算机执行DATA步骤花了0.22秒,执行FREQ程序花了0.11秒。接着我们可以检视OUTPUT窗口,可看到结果1-1 的内容,这个窗口所展示是SAS统计的结果。

第四节SAS输出

底下我们谈谈SAS系统的三个主要窗口:

PROGRAM EDITOR窗口为编辑SAS程序的地方,将内容存成档案时,其扩展名一般命名为SAS。程序执行过以后,程序代码会从窗口消失并储存在内存中,可用RECALL指令将内存中的程序再次叫回program 窗口。

LOG窗口为Program程序执行过程的记录,记录程序执行了那些叙述;产生那几个数据集;数据集中包含多少变量和观察值;程序中每个程序、步骤共享了多少CPU时间。如程序执行中间发生问题,它会指出程序出问题的位置并提供相当的解决方案等,用以确保结果的正确性,讯息记录会随程序的执行一直累计上去的,可以CLEAR指令将窗口清空。如欲将LOG内容存成档案时,其扩展名为LOG。

OUTPUT窗口为Program程序执行的结果记录,如程序没有任何输出或将输出导引至档案时,那这个窗口将不会有任何结果输出。如将窗口内容存成档案时,其扩展名为LST。OUTPUT窗口是不可编辑的。

如欲改变输出的页长、页宽时,可在程序中用OPTIONS PAGESIZE=76 LINESIZE=100;其中的76是指每页的行数,100是指每行的字数,SAS会依据页面大小输出适合版面数据。如想将结果导引至档案,可用PROC PRINTTO;程序。

请养成先看LOG窗口再看OUTPUT窗口的习惯。在LOG窗口没有ERROR的情形下, 并不保证结果是正确的。例如读入的数据值错误、格式错误、数据笔数不对等等,因而初学者一定要将LOG窗口的讯息看懂看清楚,不要忽略任何NOTE讯息,以确保读入的数据正确并得到正确的结果。

LOG窗口和OUTPUT窗口一旦清除是不能再叫回(RECALL)的,也不能在这两个窗口中作编辑(EDI T)。

第五节何谓SAS资料集

就如在不同的国度使用不同的语言、文字。要懂得它国语文,必先将它翻译我们所熟悉的语言。在计算机语言或数据中也有类似的情形,要使用不同系统建立的数据,必先将数据转换成该系统所熟悉的数据格式,才能使SAS系统最有效率的使用该数据。。

如将SAS比拟成现实社会的一员,那它必定是一位语言天才,它几乎可以转换现今存在的数据格式成为SAS 系统所使用的数据形态-称它为SAS数据集,它是一种结构化的数据储存形态,因应统计的特殊需求,加入一些有别于其它数据库的规格,如此SAS在读取和运算时能对SAS数据集作最有效的处理。 SAS系统在处理各种不同数据时,皆是将之转成统一规格的形态的数据集-SAS 数据集。

统计分析依赖数据,以操作方便性和使用习惯论,现今较常在PC看到的资料形态有: Dbase、Excel、ASCII 文字文件等格式,SAS软件提供有转换其格式数据成为SAS数据集的能力。SAS系统作各种分析统计时,都是使用SAS数据集格式,因此学习SAS的第一步便是习会建立SAS数据集。一般是用SAS的DATA步骤来建立SAS的数据集。

资料集建立后,就可以利用SAS提供的各种程序作统计、分析、绘图、预测等等作业,而其基础都是使用先前建立的数据集。

第六节何谓SAS程序

现在举一个例子,某公司要从高雄搬至台北,如要自己搬家,老板首先需要求每个员工将自己份内用得到

的对象打包装袋集中,而后择定日期雇车,全体动员一箱箱搬至货车,到达新址后,再一箱箱搬下车,而后拆箱归定位等,大小事情一堆,大家累得四脚朝天。

如老板一开始决定雇请专业的搬家公司,那员工只要将细软拿走,其余的杂事般家公司全权处理,大家轻松愉快。

SAS提供的程序就如专业的搬家公司,用专业熟悉的技能为你服务,烦杂的事不需自己来,只要几行叙述性的程序,SAS系统就能又快又正确的将工作完成,这就是SAS的proc程序。在选择proc程序来执行任务前,必须先将SAS数据集准备好,且了解资料的内函,才能知道该叫用何种SAS程序才适当,否则可能会造成要搬家,但请来的是清洁公司,但就差远了。

第七节分析顺序:

在SAS数据分析的过程中,DATA和PROC两种模块的使用,是没有特定的顺序,完全视分析者的需求而定。例如ATA ->DATA ->PROC ->DATA...,或PROC ->DATA ->PROC...皆可以,必须注意的事: 要先有SAS数据集,才能叫用PROC程序来分析数据,如无SAS数据集,则只能叫用能将其它数据库转换为SAS 数据集的PROC程序。

DATA步骤是学习SAS程序较为困难的地方,在以ASCII文字建立数据文件时,只要数据排列整齐,那使用DATA步骤建立数据集将是一件非常容易的事情;或在其它数据库软件中建立的数据,如DBASE、EXCEL 等,而后用SAS提供的数据格式转换程序也是相当简便。

PROC程序是SAS事先写好的模块,使用方式方便简单,每个程序的使用方法皆大同小异,相同的部份以下会有说明,而不同的部份在使用该程序的时候会再加以说明。唯各个研究的领域不同,使用的程序也不尽相同,因此请读者在深入探讨相关专业问题、接触到相关程序时,能先翻阅该程序的使用说明。

一个专题或报告,通常无法以一个DATA步骤或一个proc程序完成,程序执行于各模块间时,是用数据集来串连的。例如:由DATA步骤产生数据集AA,某程序将数据集AA读入分析,产生结果并制造另一新数据BB,BB数据集可由DATA 步骤重新整理和定义再产生新数据集;或再送至其它程序处理。可看出其重心皆在SAS的数据集。

程序1-1

data base;

input id sex age ;

cards;

01 1 12

02 1 15

03 2 16

03 2 18

04 2 15

;

proc freq;

tables sex;

run;

LOG1-1

1 data base;

2 input id sex age ;

3 cards;

NOTE: The data set WORK.BASE has 5 observations and 3 variables.

NOTE: The DATA statement used 0.22 seconds.

4 ;

5 proc freq;

6 tables sex;

7 run;

NOTE: The PROCEDURE FREQ used 0.11 seconds.

结果1-1

Cumulative Cumulative

SEX Frequency Percent Frequency Percent

-------------------------------------------------

1 2 40.0 2 40.0

2 3 60.0 5 100.0

第二章SAS程序语法概说

第一节SAS 程序基本格式:

⊙字母不分大小写(文件名,文字变量的值例外)。

⊙每一叙述(完整的命令statement)之后要加分号、;、。

⊙字与字之间如需有空白,可有1-无限多的空白。

⊙每一行中可有多个叙述或一个叙述分成多行撰写。

⊙建议每一叙述占用一行,并用缩排方式撰写程序。

以这种格式书写的程序较易读懂和修改。

例如:

data base;

infile 'base.dat';

input id sex yymm @@;

proc freq;

tables sex;

run;

下面所列程序的功能和上面程序比较,就功能言是相同的,但就阅读和维护上言,是以上面的较佳。

data BASE; infile 'base.dat';

input id sex

yymm @@;

proc freq;

tables

sex;

run;

第二节SAS的模块化设计

一般数据分析的流程为:建立数据(使用DATA步骤) -> 统计运算(使用PROC程序) -> 统计报表自动输出。

在往后的叙述中,我们称DATA步骤和PR OC程序为SAS的二个模块。在SAS程序中模块间是独立的,亦即当SAS程序在执行过程中,其中某一模块的程序语法有问题时,那么这个有问题模块就可能被停止执行,而SAS会紧接着处理下一个模块。

SAS程序是以模块的方式执行,在程序叙述间一般我们用RUN;叙述作为模块的结束,但这并不意味可随意用RUN;叙述。模块有模块的样式,在DATA步骤、PR OC 程序不同的模块内可出现的叙述并不一样。

DATA步骤:用以建立、修改数据集等,几乎所有数据的处理皆由此模块执行。模块开始:以DATA为开头的叙述。DATA步骤中使用的叙述有改变数据值、指定变量值等。模块结束:遇到以DATA、PROC、RUN、ENDSAS等开头的叙述或遇到程序文件的文件尾。

从模块开始,SAS系统一行一行的读入叙述。当读到以PROC或DATA叙述时,代表是一个模块的结束,且是另一个模块的开始,此时系统会先处理这个模块,而后继续读入叙述处理下一个模块。

当SAS读入叙述时,读到RUN;这个叙述时,SAS系统会将上一个模块和RUN;之间的叙述当成一个模块且处理和执行。

当读到ENDSAS;这个叙述时,SAS系统会将上一个模块和ENDRUN;之间的叙述当成一个模块且处理和执行,处理完毕后自动关SAS系统。

当SAS系统读入了一些叙述,但最后一直未出现模块结束的条件时,则SAS 系统则将这些叙述,保留在一块内存中,直到有模块结束的叙述被读入且构成一模块时,再一并处理。

PROC程序:用以执行SAS系统内建的一些建大功能,如计算回归、变异数分析等,其特性是可用简短的叙述执行强大的运算,并得到完整的结果。

PROC模块内可用的叙述通常是一些选项,用以选择用何种统计方法,要有那些结果输出等,初开始接触SAS或对某一PROC较生疏者,可以省略这些选项,SAS系统会用事先设定的模式内容-称之为内定值,计算出一般常用的式子和结果,等到熟悉了程序后,更可以依自己的需求,要求更多更详细的数据或只要印出一些必要的数据,不用让费篇幅印出一大堆参考数字。

如同DATA模块,遇到以DATA、PROC、RUN、ENDSAS等开头的叙述或遇到程序文件的文件尾,即表PROC 模块结束。

第三节批注的使用

在程序中使用批注是非常重要的。例如将程序的功能和目的、暂存变量的说明、公式转换的说明等等写成批注放在程序的里,以备日后查阅和维护。当然要将程序交给别人时,有批注就更方便了。若有些程序片段可能暂时不要执行,也可以用批注方式将程序当作批注处理。

所谓批注就是给人看的,SAS程序遇到这些批注行时,会直接略过不加处理。

SAS 的批注方式有下列两种,区块批注和行批注。

区块批注: 在"/*"和"*/"这两组符号中间夹着的所有文字皆为

批注,可以跨行或只占一行中的任一部分,如

/* DATA AA; */

DATA /*建立数据*/ AA;

不可使用巢式批注,即批注里不可再含有批注,

如下式是不对的:

/* DATA /*建立数据*/ AA; */

行批注:在行的最前头以"*"注记,可将

"一个叙述"(statement)注记为不执行:如

*DATA AA;

下式只有DATA AA;不执行,而INPUT A;仍然会执行。

因DATA AA;即为一完整叙述。

*DATA AA; INPUT A;

第四节OPTIONS、TI TLES和FOOTNOTE的使用

OPTIONS、TITLE和FOOTNOTE这三个叙述可用在程序中的任何地方,一但程序执行到这些叙述时,叙述内容即发生作用,且其影响范围直至SAS系统关毕或遇到下一个相同的叙述为止。

OPTIONS叙述可用以改变一些系统设定值,如:OPTIONS PS=60 LS=78 ; 改变LOG和LST窗口的输出页大小。

TITLEn和FOOTNOTEn叙述可用来设定OUTPUT窗口的标题和注标,n可为1-10的数字。当你设定标题后,除非删除该行或另外再定义行数一样的标题,否则以后的输出标题行都会存在。一个TITLEn已知的标题行会删除前面同样行数的标题,同时大于n值的标题也会被删除,要删除所有存在的标题可用TITLE;叙述。

TITLE1 'FIRST TI TLE';

TITLE2 'SECOND TI TLE';

TITLE3 'THIRD TI TLE';

TITLE4 'FOR TH TI TLE';

TITLE2 '第二列标题'; /* 只有第一和第二标行会印出*/

/*注意叙述生效的位置*/

PROC PRINT;

TI TLE 'TI TLE FOR FIRST PROC';

PROC MEANS;

RUN;

/*TITLE叙述作用于PROC PRINT和PROC MEANS两个程序*/

PROC PRINT;

RUN;

TITLE 'TI TLE FOR FIRST PROC';

PROC MEANS;

RUN; /*TI TLE叙述仅作用于PROC MEANS程序*/

OPTIONS:为SAS的系统选项,一旦改变其值则自改变处起,往下所有的DATA和PR OC程序皆会有作用。

使用方式:OPTIONS options;可在程序中任何地方出现。

OPTIONS PS=60 LS=78 NOCENTER NODATE;

PS=n 界定印出报表每一页的长度

LS=n 界定印出报表每一页的宽度

NOCENTER/CENTER 输出的结果是否摆在报表的中央

NODATE/DATE 是否印出日期

NUMBER/NONUMBER 是否印出页码

FIRSTOBS=n 从第几笔开始处理数据集

OBS=n,max 只处理资料集的前n笔(测试程序时,可将

n减少或定为0,可减少处理数据的时间)。

MISING='字符' 界定数据集中的那些字符是属缺失值。

第三章DATA步骤

第一节于DATA步骤中的SAS语句

SAS Dataset 的运作

⊙SET 观察值的串并和分成子集

⊙MERGE 合并不同数据集的观察值

⊙KEEP 保存变项

⊙DROP 剔除变项

⊙OUTPUT 将观察值存入sas dataset

⊙DELETE 删除观察值

⊙FIRST.var、LAST.var 判别观察值是否为群组的

第一或最后一笔数据

⊙_N_ 目前data step 中处理的观察值的流水编号

⊙RETAIN 保留上笔观察值的信息

⊙ARRAY 以数组的方式处理变项

⊙指定变值x=5;

⊙改变数值x=x+5; x=x+b;

⊙逻辑判断if x>20 then x=20;

⊙分组if age> 5 then agp=2; else agp=1;

⊙删除观测值if age=. then delete;

⊙保留观测值if age >0 ;

⊙保留、删除变数keep vars.....; drop vars... ;

⊙函数的使用mdbp=mean(dbp1, dbp2 ,dbp3) ;

mdbp=mean(of dbp1-dbp3);

mdbp=mean(of dbp1-dbp2 ,dbp3) ;

⊙资料串拼data aa; set a b;

data aa; set a; set b;/*不正确*/

⊙数据合并data aa; merge a b;by vars;

data aa; merge a b;/*不正确*/

第二节SAS 数据集的建立

SAS数据集的建立依数据来源的不同有各种不同的方式,如下:

使用DATA步骤从ASCII文件读取数据,以INFILE叙述界定ASCII的文件名称,以INPUT叙述定义变量名称并指出数据在ASCII文件的相对字段。

用程序仿真产生数据集:以OUTPUT配合STOP叙述。

利用PROC ACCESS;程序读取其它常用数据库的数据集,如DBF、DIF、EXCEL等,并建立SAS数据集或SAS的VIEW数据集。

由已存在的SAS数据集建立,如:串并资料集:使用set叙述。合并数据集:使用merge叙述。

由某些PROC程序产生:系统中有某些PROC程序可将运算的结果,直接储存成数据集以供进一步分析。如PROC MEANS、PROC REG等。

PROC SQL程序产生的TABLE或VIEW建立数据集。

第三节读取外部数据集

数据库介绍->TXT文件、DBF文件和SAS 数据文件

利用libname指出sas 数据文件存放的位置

读取TXT檔使用infile、input 和data filename

认识分析资料的性质->每个案笔数、总笔数、

变项名称及其位置

变量名称和格式的设定

LABEL的使用

FORMAT的使用

(1).数据建文件时,数据格式、位置的安排完全自由,但要有逻辑可循。最好是排列整齐(可左靠或右靠),数据之间留或不留空白皆可。

(2).data value (资料值) -- 遇缺失值时请留空白或打入'.'。

(3).observation (观察值) -- sas在统计处理数据时,视每笔观察值之间是独立的。

(4).variable (变数) -- 变量名称由1-8个字符组成,并以字母开头。变量依其内函值分[文字变量]、[数字变量]两种。

永久数据集和暂存数据文件的差异。

第四节确认读入的数据

查看log窗口最否有语法错误及其变量个数和数据笔数。MISSING值的产生.如原值为12误植为1 2,I2

等。利用PROC PRINT; 查看SAS数据集的内容。利用proc sort nodupkey; by caseid; 查看sas资料集中是否有重复的caseid。

第五节SAS数据集内容

利用PROC CONTENTS; 查看SAS数据集的表头数据。利用command-> DLGLIB 叫用数据馆管理查看数据集

第六节值的大小比较

两文字变量值的比较,如逻辑正确则值为1,错误则值为0 (长度不同时,较短的变量补上空白)

'aa ' > 'aa' 0

' aa ' < 'aa' 1

'aa ' = 'aa' 1

'ab' <=: 'a' 1

使用>=:、<=:、=:比较时,文字长度不同时,较长的变量会将多出的部份删除。

如同文字变量,两数字值的比较,逻辑正确则值为1,错误则值为0。如值为0或'.'则结果为0,其它值时则结果为1。

1 > 5 0

100 < 1001 1

50 1

0 0

-20 1

. 0

叙述a=b=c;则a的值不是1就是0,当b=c则a的值为1。

叙述a+b=c;则a的值为原有的值加上1或0,当b=c则a的值加上1。

在DATA STEP 中叙述IF a IN (1,2,3,5,7);表只保留a变量的值为1,2,3,5,7的观察值。如为文字变量可写为IF a IN ('1','2','3','5','7');其反述为IF a NOTIN ('1','2','3','5','7'); 在文字变数字可用IF a IN: ('1','2','3','5','7') ;其意义表留下a变量以1,2,3,5,7开始的文字符串的观察值。

第七节缺失值

键入原始数据时,缺失值一般而言,可用'空白'或逗点'.'表示。但须注意:以行输入时,数字变量可用空白或'.'、文字变量请用空白,不要用'.'。用列举变变输入时,不管数字或文字请月'.'表缺失值。在程序中缺失值的表示法:数字变量用[.]表示,如IF a=. THEN DELETE;。文字变量用['']表示,如IF name='' THEN DELETE;

一般视数字变量的缺失值为无限小,但文字变量的缺失值就不一定是最小,因在文字变量中,空白值即为缺失值,但比'空白'小的ASCII码还有很多。

MISSING叙述的使用:时机:在数字变量中,会发生缺失值的状况有多种,如:问卷中提及年龄时,可能有下列答案:

1.先生回答30岁

2.女士不回答

3.小孩回答不知道

4.老人说忘记了

5.访员忘记问

编码:对于上叙答案中,除了先生的答案有效外,其余的回答皆应归类为缺失值,如须在缺失值中细分拒答(R)、不知道(N)、忘记年龄(F)、忘了问(.)等,可用一英文字母替代。

使用方式:在程序中宣告MISSING R N F M ...;叙述。

在PROC程序中,所有种类的缺失值都一视同仁,皆归类为MISSING值,不参与统计运算。

在DATA步骤中,各类的缺失值其值大小是不一样的,依上述编码,如在DATA步骤中写:IF ans=. THEN PUT id= ; 则只有访员忘了问的个案编号才会列出。如在DATA步骤中写:IF ans=.R THEN PUT id= ; 则只有不回答的个案编号才会列出。

在DATA步骤中,分类后的缺失值其值的大小为: ._ < . < .A < .B <...< .Z。因此要将年龄变量中所有含缺失值的个案编号列出,在DATA步骤中必须写成:IF ans <= .Z THEN PUT id=;

第四章SAS程序

第一节SAS程序语法概论

SAS 数据集建立后,即可利用SAS 程序加以分析、处理。SAS 程序是由一些程序组成, 可以读入SAS 资料集、计算统计量、印出结果或建立其它的SAS 数据集。在DATA步骤中可以利用SAS 的指令构建程序以处理数据、描述建立的数据集。而在PROC程序可以依特定目的呼叫适当的程序。

最简单的PROC程序,其内定的处理程序为:

1.系处理最新建立的SAS 数据集。

2.系处理所有的变量, 并对所有的数字变量执行运算。

3.系处理数据集的全部数据, 而非部份资料。

大部份SAS 程序所共享的叙述。

BY var→将输入的数据集, 依var变量分组作分析。

CLASS sex→指定分析时的类别变量sex。

FREQ fq→指定一变量,以代表这笔观察值出现的次数。

ID caseid→指定一个或多个变量,作为输出报表观测

值的识别变l数。

MODEL bp=sex age→指出在一个模式中,独立变量和

相依变量名称。

OUTPUT out=dataset mean=mage; →指出新建输出资料

集中的相关资料。

VAR height weight→指出即将分析的变量名称。

WEIGHT lkk→指出某一变量作为观测值的权数。

经常使用于说明变量属性的叙述句为:

FORMAT date yymmdd6. →指出变量值以何种格式展现

(如日期以民国或公元印出)。

LABEL date='日期'→将date变量名称以'日期'替代印出。

第二节在PROC中处理数据子集

在PROC程序中可使用WHERE叙述,以取得部份观察值进行分析。

proc print data=sasuser.class(keep=name sex height);

where sex='F';

第五章数据的读取、建立

第一节文字和数字间的互转

1.注意:尽可能在INPUT时界定好变量的属性:往后需要作计算的变量用数字变量。含有文字或不需计算的变量用文字变量读入。

2.生米煮成熟饭时:面对现实,加点功夫补救吧。

3.不择手段:YY表年龄的文字变量,令AGE=YY+0; 则AGE为数字变量-->快则快矣,但LOG会有讯息告'诉'你违规。数字变文字-->加强拖钓,不准违规。

4.利用INPUT()函数:文字变数字。AGE=INPUT(YY,3.); 其中YY为文字变量,3.为编修(FORMAT)符号,AGE 为数字变量。

5.利用PUT()函数:数字变文字。YY=PUT(AGE,3.); 其中YY为文字变量,3.为编修(FORMAT)符号,AGE为数字变量。

6.实例/*出生数据的读入(民国五十年四月十二日出生,现在年龄为何*/

DATA aa;

INPUT birthday ; /*以一般数字读入*/

bir=input(put(birthday,6.),yymmdd6.);

age= (DATE() - birthday) /365.25;

CARDS;

610412

;

DATA aa;

INPUT birthday yymmdd6.; /*以公元日期格式读入*/

age= (DATE() - bir) /365.25;

CARDS;

610412

;

第二节DATA数据集的操作

第一项copy一份资料集

DATA aa;

SET jim.urine;

/*没有特殊原因,不要用此data step,你没有功劳或苦劳,但计算机会疲劳*/

第二项将变项分成多个子集

DATA aa;

SET jim.urine;

KEEP id date no time;

* DROP u_hi;

DATA aa;

SET jim.urine (KEEP=id date no time);

* SET jim.urine (DROP=u_hi);

DATA aa(keep=id date no time);

*DATA aa(DROP=u_hi);

SET jim.urine ;

DATA aa(keep=id date no vol);

SET jim.urine(drop=time);

vol = u_hi*3.1416*2.5*2.5 ;

DATA aa(keep=id date no time) bb(keep=id date no u_hi);

SET jim.urine ;

第三项将观察值分成多个子集

DATA aa;

SET jim.urine ;

IF date < 400 ;

* IF date < 400 then OUTPUT;

* IF date >=400 then DELETE;

DATA aa bb;

SET jim.urine ;

IF no = 1 then OUTPUT aa;

/*sas dataset aa仅含no=1的观察值*/

OUTPUT bb;

/*sas dataset bb和jim.urine的数据完全相同*/

/*注意:在DATA STEP 中,当DELETE指令执行后,则剩余的

指令将不再执行,程序重头开始处理另一全新的

观察值。

而OUTPUT指令执行后,将续继执行剩余的指令。*/

第四项产生新变量或改变变量值

DATA aa bb;

SET jim.urine ;

u_vol = u_hi*3.1416*2.5*2.5 ; /*产生新变量*/

* u_hi = u_hi*3.1416*2.5*2.5 ; /*改变变量值*/

/*注意:1.改变变量内容时,请注意'数字'改为'数字',

'文字'改为'文字',不可互换。

2.改变数内容时,如加上逻辑判断时,请特别注

意每一步骤变量值的变化,否则请以另一新

变量接收新值,而不要直接更改变量内容。

3.特别注意missing资料的归属问题*/

/*IF age >50 then age=3;

if 20 <= age <=50 then age=2;

if age < 20 then age=1 ; */

DATA male female;

SET pepole;

IF sex=1 THEN OUTPUT male;

ELSE OUTPUT female;

/*dataset male含sex=1的观察值, dateset femal含sex等于其它值的观察值。dataset male,female的观察值总和等于dataset pepole的观察值笔数。*/

DATA male female;

SET pepole;

IF sex=1 THEN OUTPUT male;

IF sex=0 THEN OUTPUT female;

/*dataset male含sex=1的观察值, dateset femal含sex=0的观察值。dataset male,female的观察值总和小于或等于dataset pepole的观察值笔数。*/

第五项串并资料集

data a1;

input id sex ht wt bmi;

cards;

1 1 16

2 52 25.2

2 1 158 50 25.1

3 2 150 45 24.0

;

data a2;

input id sex wt ht ;

cards;

1 1 5

2 162

2 1 50 158

3 2 45 150

4 2 40 145

5 2 65 170

;

data aa;

SET a1 a2;

run;

/*注意:1.串并时如果有不同的变量,则除了自己拥有的变量外, 其余变量皆为缺失值。

2.串并时,请注意是否某些变量其变量名称相同,但属性不同。 */

data aa;

set a1(in=in1) a2;

if in1 then class=1;

else class=2;

* class= in1 + (in1=0)*2;

data aa;

set a1(in=in1) a2(in=in2);

class=in1*1 + in2*2;

/* 1.data set之后可加入IN=var选项,记录此data set是否对新产生的观察值有贡献,有贡献则var=1,否则为0 。

2.在逻辑判断式中,成立时则其值为1,不成立时则其值为0。

3.在逻辑判断式中,变量值=0时其逻辑判断式为'伪',其它值时,其判断式为'真'。因此上面的程序可产生一新变量class ,记录观察值来自那一个dataset。 */

data aa;

set a1;

set a2;

/* 错误示范结果为数据一对一合并,数据笔数为合并的dataset中笔数最少者 */

第六项穿插资料集

proc sort data=a1; by id;

proc sort data=a2; by id;

data a12;

set a1 a2; by id;

run;

/*注意:使用by指令串并数据时,数据的观察值按id 的大小顺序放入a12数据集中。否则a12数据集中观察值的顺序是先放a1再放a2*/

第七项MERGE 合并数据

data b1;

input id dbp sbp;

cards;

1 90 120

3 65 125

2 75 110

;

data b2;

input id sex dbp sbp;

cards;

1 1 90 120

2 1 75 110

3 1 105 165

3 1 108 155

4 2 87 124

;

/*一对一合并,无条件的合并*/

data ab1;

merge a1 b1;

/*一笔a1的数据配一笔b1的数据,合并后的数据笔数为笔数最多的资料集。此种方式不常用(通常是错误的使用)。*/

/*配对的合并,利用BY叙述*/

proc sort data=a1; by id;

proc sort data=b1; by id;

data ab1;

merge a1 b1;

by id;

run;

/*注意:1.使用MERGE合并数据时,务必使用BY叙述。未用BY叙述的合并,通常非吾所要。2.合并所用要的SAS DATASET务必确定已照BY叙述中变数的大小排列。*/

第八项配对所产生的问题

1.没有BY值配对者,则当笔观察值的变量值为missing。可利用变量IN=var来判断一数据集对新建的观察值是否有贡献。

proc sort data=a2; by id;

proc sort data=b2; by id;

data ab2;

merge a2(in=in1) b2(in=kk);

by id;

IF in1 and kk;

*IF in1=1 and kk=1 THEN OUTPUT;

2.数个观察值有相同的BY值,如b2中有ID重复,merge 时会有一样的HT,WT

3.合并的数据集中有相同的变量名称(BY变数除外): 若只有一个相同BY值的观察值,则新数据集的变量值是最后一个数据集的值。若有多个相同BY值的观察值,则新数据集的变量值是最后一个有页献的数据集的值。解决方案:将其中不要的变量值自DATASET中DROP掉。

DATA a2和b2中均有sex的变项存在,已知DATA aa中的sex值是正确的。

DATA ab2;

MERGE a2 b2(DROP=sex);

BY id;

4.两个数据集中,相同的BY值均有多个相同的观察值,如AA数据集存放个案三餐的饮食(早、中餐可能吃了某些相同的食物,而BB资料集中存放食物品名和其组成。

如想依食物品名合并AA和BB两档,是否可行?

第二节FIRST.var、LAST.var和_N_的使用

/*假如aa这个dataset经PROC SOR T;BY class sex ; 处理过后,得到如下的数据:往后在将此数据集作合并、串并处理时,加入BY class id ;叙述时,可有下列4个变项可供逻辑判断时使用:first.class, last.class, first.sex ,last.sex 这些变量的值,不是0 就是1,变化请见下表:

class id sex ht wt first.class last.class first.id last.id

1 1 1 16

2 52 1 0 1 0

1 2 1 158 50 0 0 0 1

1 3

2 150 45 0 1 1 1

2 1 1 162 52 1 0 1 0

2 2 1 158 50 0 0 0 1

2 3 2 150 45 0 0 1 0

2 4 2 145 40 0 0 0 0

2 5 2 170 65 0 1 0 1

上面所提的first.var , last.var 和IN=var一样,如果你有界定则可在DATA SETP中使用,而_N_这个变量则必可在DATA STEP中所用, 但上面所提的这些变项皆不会储存到数据集中,除非你另外指定, 如F_ID = FIRST.ID;以F_ID这个变项接收FIRST.ID的值。*/

PROC SOR T DATA=aa;

BY class sex;

DATA aa;

SET aa;

BY class sex;

IF first.class ; /* dataset aa含每班第一个人的资料*/

DATA aa;

SET aa;

BY class sex;

IF first.sex ; /* dataset aa含每班第一男或女的资料*/

/* data step中,在每一个新的loop回路开始时, 所有的变量值皆会清除, 变为missing,以免上一笔观察值的值留给下一笔资料。但有时上下笔观察值有关系存在,则须要保存上一笔某变量的值时,则可用RETAIN叙述来保存。使用方式为:RETAIN var_list initial_value ...; 或:sum变数, 用方为total+1; */

第三节观察值的合并或分离

第一项单笔变多笔(横式变直式)

设aa资料集含id dbp1-dbp4 五个变数。现欲将aa转换为bb数据集, 含id no dbp三个变量,其中no为记录是第几次测量的血压。

方法一(从ASCII文件读入数据时即分开读取):

data bb;

input id dbp @;

no=1; if dbp>0 then output;

input dbp @;

no=2; if dbp>0 then output;

input dbp @;

no=3; if dbp>0 then output;

input dbp ;

no=4; if dbp>0 then output;

cards;

1 70 75 86 80

2 85 82 86 84

3 7

4 52 80 62

4 90 . 62 72

5 75 80 . 75

;

方法二(由SAS DATASET步骤分开):

data aa;

input id dbp1-dbp4 ;

cards;

1 70 75 86 80

2 85 82 86 84

3 7

4 52 80 62

4 90 . 62 72

5 75 80 . 75

;

data bb;

set aa;

no=1; dbp=dbp1; if dbp>0 then output;

no=2; dbp=dbp2; if dbp>0 then output;

no=3; dbp=dbp3; if dbp>0 then output;

no=4; dbp=dbp4; if dbp>0 then output;

keep id no dbp;

run;

第二项多笔变一笔(直式变横式)

设bb数据集中,含id no dbp三个变量,其中no为记录是第几次测量的血压。现欲将之转换为aa数据集含id dbp1-dbp4五个变数。*/

PROC SOR T DATA=bb; BY id no;

DATA aa;

SET bb;

BY id no;

RETAIN dbp1-dbp4 ;

IF no=1 then dbp1=dbp;

else if no=2 then dbp2=dbp;

else if no=3 then dbp3=dbp;

else if no=4 then dbp4=dbp;

IF last.id THEN DO;

OUTPUT;

dbp1=.; dbp2=.; dbp3=.; dbp4=. ;

END;

DROP no dbp;

run;

/*使用ARRAY可简化程序的的写作,使程序维护和阅读容易。*/

一笔变多笔

DATA bb;

SET aa;

ARR AY bp{4} dbp1-dbp4;

DO no=1 TO 4;

dbp=bp{no};

if dbp>0 then output;

END;

DROP dbp1-dbp4;

多笔变一笔

proc sort data=bb; by id no;

data aa;

set bb;

by id;

retain dbp1-dbp4;

array bp{4} dbp1-dbp4;

bp{no}=dbp;

if last.id then do;

output;

do i=1 to 4;

bp{i}=.;

end;

end;

drop i no dbp;

run;

第六章程序使用

第一节DBF程序直接读取DBASE档案※

在PC中存有一附文件名为DBF的资料文件,文件名为urine.dbf,现在欲把它转为SAS的DATASET,档名取为uu

1.直接利用PROC DB3;程序读取

FILENAME jim 'urine.dbf';

PROC DBF DB3=jim OUT=uu;

2.先在DBASE软件中,将档案转为ASCII檔,而后再以一般SAS读取数据(INFILE、INPUT)的方式读入数据在DBASE软件中

.USE URINE

.COPY TO UU SDF &&产生一文字文件,文件名为UU.TXT

.QUI T

书写一SAS程序

DATA uu;

INFILE 'uu.txt' LRECL=n PAD;

INPUT id .......;

注意BASE软件无法处理MISSING的数据。建议:将DBASE的字段全部设为文字型态, 利用DBASE的数据管理能力来管理数据。用DBASE档转换为ASCII文件的方式,读取数据成SAS文件,作统计分析。

注意:在DBASE中如果有删除数据,经SAS的PROC DBF处理时,仍会将删除的整笔数据转入。

第二节ACCESS程序撷取DBF和XLS数据库

可在SAS的MAIN MENU中选FILE中的IMPORT或EXPOR T,即可将多种不同格式的数据转入或转出。以下使用proc access程序转换DBASE文件至SAS

proc access dbms=dbf;

create work.dbase.access;

path="c:\class\dbase.dbf";

assign=yes;

create work.dbase.view;

select all;

subset where delete_f=' ';

run;

以下使用proc dbload程序转换SAS文件至DBASE

proc dbload dbms=dbf data=dbase;

path="c:\class\dbase2.dbf";

load;

run;

以下使用proc access程序转换EXCEL文件至SAS

proc access dbms=excel;

create work.excel.access;

path="c:\class\excel.xls";

getnames=yes;

scantype=5;

assign=yes;

create work.excel.view;

select all;

run;

以下使用proc DBLOAD程序转换SAS文件至EXCEL

proc dbload dbms=excel data=excel;

path="c:\class\excel.xls";

putnames=y;

LIMIT=0;

load;

run;

第三节CONNECT程序连接远程主机

/*起动联机程序*/

options comamid=tcp remote=gate1;

filename rlink 'tcpunix.scr'; /* 必要时写上绝对路径*/ signon;

/* 将程序送至远程执行,并将执行结果送回 */

相关文档
最新文档