第4章SAS软件的深入应用.docx
- 文档编号:28469075
- 上传时间:2023-07-14
- 格式:DOCX
- 页数:47
- 大小:274.01KB
第4章SAS软件的深入应用.docx
《第4章SAS软件的深入应用.docx》由会员分享,可在线阅读,更多相关《第4章SAS软件的深入应用.docx(47页珍藏版)》请在冰豆网上搜索。
第4章SAS软件的深入应用
第四章SAS软件的深入应用
第一节SAS编程概念简介
一、SAS程序的运行
我们用例子来说明在SAS显示管理系统内是如何进行程序运算的。
若要将一个外部数据文件转换成SAS数据集,首先在Editor窗口内编辑程序:
dataclass;
infile'c:
\sas\class.txt';
inputname$group$birthdayheightweightenglishmath;
run;
然后在菜单栏内按SUBMIT命令(或按F3)键,或在Run选项菜单内选择submit,将程序提交给SAS系统处理。
这时,LOG窗口显示出数据集建立成功及执行时有关的信息,包括错误和警告信息。
要想在屏幕上查看数据,双击Explorer窗口中的Work子目录,再双击class数据集图标。
按F3提交程序以后,假如没有错误,OUTPUT窗口自动输出PROCPRINT过程步运行结果。
在这儿注意,一旦数据建立以后,就不必再提交DATA步了。
例如你还可再次提交PROC步,产生一个表格:
proctabulate;
classgroup;
tablegroup;
run;
LOG窗口累计显示历次执行程序的信息,在OUTPUT窗口内显示出PROCTABULATE步产生的表格。
执行END命令(或按F3键)回到Editor窗口。
在命令行执行MANAGER命令可以管理OUTPUT窗口的内容,在OUTPUTMANAGER窗口中有下列字命令可供选择:
S查看所选的页。
(该命令还可以用在其他窗口,例LIB,VAR等。
)
E编辑所选的页。
P打印所选的页。
D,V删除所选的页。
F将所选的页存到一个文件中去。
如果出现错误信息,用RECALL命令(或按F4键)调回刚提交的程序进行修改。
它的一般格式为:
RECALL
RECALLn
n为调回最近n次提交的所有程序。
例如:
在命令行输入RECALL3
回车以后,把三次提交的程序一起调回PGM内。
RECALL命令还可以用快捷键F4或在LOCALS选项菜单内选择RECALL。
在显示管理系统内还有其他的常用的命令:
-
ZOOM改变窗口的大小,也可用鼠标点一下窗口的右上方的图标。
CLEAR清除窗口内的内容,也可在EDIT选项内选择Cleartext项。
FILE将PGM内的内容存入一个文件中去;也可在FILE选项内选择Saveas项。
INCLUDE将外部文件拷贝到Editor窗口,也可在FILE选项内选择Open项。
二、SAS程序
SAS程序是由用户向SAS管理器提交的要运行的一系列的过程步组成。
SAS管理器再调用SAS系统合适的部分来完成程序中所定义的任务。
SAS程序有两种类型的步组成。
通常用来建立SAS数据集的被称为数据步。
它是以DATA语句开头,以RUN语句结尾。
另一种通常用来分析并处理SAS数据集,生成所需的信息,称为过程步。
它是以PROC语句开头,以RUN语句结尾。
当有多个数据步或过程步混在一起提交给SAS处理器处理时,DATA语句或PROC语句起到前一步的RUN语句的作用,故两步之间的RUN常可省略,但最后一步必须以RUN语句结束。
程序中出现的每一个步都是独立的,彼此不能交叉,不能嵌套。
在SAS程序中每个步由一个或多个语句组成。
SAS语句一般由SAS系统能识别的关键字开头,总是用分号“;”结尾。
SAS语句是自由格式的,能够在任何位置开始或结尾,一条语句可以连续在一行上,几条语句可以在一行上。
三、SAS数据集
许多SAS过程和一些数据步语句处理的数据必须是SAS数据集的形式。
SAS数据集是由两部分组成。
一为描述性部分,包含有数据集的一般信息,例数据集名,建立数据集的时间,观察值的数目等存储信息。
还包含有数据集中变量的属性,例如变量名,变量的类型,长度,输入输出格式,标记,位置等。
另一个为数据值部分,它被安排成矩形状表格。
每一列与数据字段相对应的是变量,变量有字符型和数值型两种变量。
表格中的每一行为观察值,它对应于一行数据的记录。
缺失的数值型变量值用“.”表示,缺失的字符型变量值用空格显示。
对SAS数据集名及变量命名的规则是相同的。
名字的字符长度为1个~8个,必须用字母或下划线开头,中间可用任何字母、数字及下划线。
所有的数据集都有两级名字,并用句号“.”隔开。
第一级为库逻辑名,它为数据集库存放的物理位置的别名,它也确定了文件是临时性的还是永久性的。
SAS文件名一般的形式为:
libref.SAS-filename
libref为库逻辑名。
SAS-filename为数据库内具体涉及到的SAS文件名。
libref缺省时,SAS系统就采用WORK库名,这数据集为临时性的,当退出SAS系统后,WORK库内的文件将消失。
如果要建立永久性的文件,就必须指定一个除了WORK以外的名。
SAS系统有一个永远存在的库,其名为SASUSER。
假如想将文件放在你指定的位置内,可以使用LIBNAME语句。
它的一般形式为:
LIBNAMElibref‘d:
path’;
例:
LIBNAMEabc'c:
\sas';
在提交以后即建立了库名为ABC的数据库。
其物理位置在C盘ABC目录内。
假如要删除定义过的库名,可使用CLEAR选项:
LIBNAMEabcCLEAR;
四、SAS系统的日期
SAS系统的日期值,是以1960年1月1日至读入日期之间的天数表示的,在1960年以前用负数表示。
日期时间常量是用单引号括起日期值,后面接一个D(DATE)、T(TIME)或DT(DATETIME)来表示其类型。
例:
'17oct91'D11612(天)
'2:
45:
32P'T53132(秒)
'17OCT91:
14:
45'DT1003329900(秒)
SAS系统日期若没有定义输入输出格式,将按SAS日期值读取或输出。
五、SAS函数
SAS函数是一个已编好的程序,它对一个或多个自变量计算以后,返回一个确定的值。
一般格式为:
function—name(argumentl,argument2,…)
每个自变量之间用逗号分隔,大多数函数可接受的自变量为常量、变量、表达式、函数。
例:
SUM(argumentl,argument2,…)计算自变量和。
UPCASE(argument)将自变量转换成大写的字符串。
MDY(month,day,year)转换成SAS日期。
YEAR(SAS-date)将SAS日期返回到四位数的年份值。
QTR(SAS-date)将SAS日期返回到数值为1~4的季度值。
MONTH(SAS-date)将SAS日期返回到数值为1~12的月份值。
WEEKDAY(SAS-date)将SAS日期返回到数值为1~7的星期值,1代表星期日,2代表星期一,…
还有其他函数可查HELP:
将光标移到HELP以后选择SASSYSTEMHELPS,再选索引,输入function查看。
六、SAS表达式
SAS表达式由一系列运算数和操作符构成,运算数可以是变量名或常数,操作符有:
(1)算术操作符
+加;一减;*乘;/除;**乘方。
对一个算术操作符的运算数若为缺失值,结果也为缺失值。
(2)比较操作符
=或EQ等于;^=或NE不等于;>或GT大于;
>=或GE大于等于;<或LT小于;<=或LE小于等于。
IN(argumentl,argument2…)等于列表中的某一项值。
例:
X+31N(5,Y*2,7)表示如果Y=6时,X=2、9、4时表达式为真;X为其他值时表达式为假。
(3)逻辑操作符,
&(AND)与;|(OR)或;^(NOT)非。
(4)其他
<>取大值;><取小值;||字符串连接。
操作符的优先级:
最高级**乘方;^(NOT)非;+、-正、负号
第一级<>、><取最大、最小
第二级*、/乘、除
第三级+、-加、减
第四级||字符串连接
第五级<、<=、^=、>=、>、=、^>、^<
第六级&(and)与
第七级|(or)或
第二节用DATA步建立SAS数据集
要对数据进行分析,首先需将数据建立成SAS数据集,以便供PROC过程步进行处理。
通常我们采用DATA步来建立和修改SAS数据集。
一、DATA步的流程
当你把写好的程序提交以后,SAS系统是分两个阶段编译程序和执行程序来执行DATA步的。
在编译时,首先建立一个外部文件的数据记录的输入寄存器,然后建立当前观测值的程序数据矢量(PDV),再从PDV存储的信息中建立起数据集的描述部分。
在执行阶段中,每次执行DATA步时,先将PDV中变量进行初始化,并赋予缺失值。
然后执行读语句及其他语句,将PDV中的值写到SAS数据集去,程序再回到步的顶部,直到结尾。
其流程图如下:
当数据发生错误时,SAS系统将对变量分配一个缺失值。
在LOG窗口给出程序执行的信息。
在处理每个DATA步时,SAS系统自动建立两个变量,_N_和_ERROR_,并放在PDV内。
_N_是DATA步执行的次数。
_ERROR_是执行DATA步时数据发生错误的信息。
当遇到数据错误时,_ERROR_=1。
没有数据错误时,_ERROR_=0。
’
这些自动变量可在编程中使用,但不写到SAS数据集内,这两个变量在编程中是很有用的。
二、建立数据集使用的基本语句
1.DATA语句
DATA语句有两个主要作用:
一是表明DADA步的开始,二是对SAS数据集进行命名。
DATA语句的一般格式为:
DATASAS-data-set(s);
SAS-data-set是两级SAS数据集名。
2.INFILE语句和CARDS语句
如果从一个外部文本文件(ASCII码)中读取数据记录时,需要使用INFILE语句。
该语句必须在INPUT语句前面使用,它的一般格式为:
INFILE‘filename’options;
filename为读取的文件名,并标明该文件的路径。
例:
’c:
\abc\a.dat’
options控制读取的数据行。
它有FIRSTOBS=及OBS=选项,一般格式为:
INFILE‘filename’FIRSTOBS=n1OBS=n2;
n1为读取的第一条记录所在的值。
n2为读取的最后一条记录所在的值。
假如没有指定FIRSTOBS=,就从头开始读取文件的记录。
若没有指定OBS=选项,那么将读完文件的记录。
如果你将数据直接编入程序中,可使用CARDS语句。
该语句表明数据行开始,并且必须放在其他语句之后,其一般格式为:
CARDS;
数据记录
;
注意:
数据结尾的分号必须单独另起一行。
3.INPUT语句
它是读取INFILE或CARDS语句所指定的数据观察值,并对相应的数据字段分配SAS变量名。
INPUT语句有几种模式输入:
列输入、格式输入、自由格式输入。
(1)列输入
列输入是按一个固定的列来读取标准的字符型和数值型的数据,它的一般格式为:
INPUTvariable$startcol-endcol…;
variable定义有效的SAS变量名。
$表明为字符型的变量,缺失为数值型变量。
startcol-endcol变量在输入文件中开始和结尾的列的位置。
例:
INPUTlname$1-15fname$21-35sex$40salary46-51;
(2)格式输入
格式输入是按变量名规定的输入格式来读取数据的。
其一般格式为:
INPUTpointer-controlvariableinformat…;
pointer-control位置控制指针,有;
@n指针移到第n列位置上。
+n指针移动n列(n可以为一个列号、指针变量、表达式)。
informat表明字段宽度及如何读取字段内的数据值的输入格式。
它的一般格式为:
$informat-namew.d
$表明为字符型格式。
informat-name是INFORMAT语句或SAS内部所定义的输入格式名。
w是用户任意选择的字段宽度。
.是必须要有的定界符。
d是定义数值型输入格式的小数部分的规格。
例7.2读取7列数值型数据,内包括了小数点和小数部分2列。
$15读取15列字符型数据。
DOLLAR8.2读取8列数值型的数据,包括具有$符号,逗号字符及两位小数。
COMMA6.读取6列数值型的数据,包括具有$符号及逗号字符。
MMDDYYw.读取日期形式为101692(MMDDYY6.)或10/16/92(MMDDYY8.)。
DDMMYYw.读取日期形式为161092(DDMMYY6.)或16/10/92(DDMMYY8.)。
·
DATEw.读取日期形式为16OTC92(DATE7.)或16OCT1992(DATE9.)。
MONYYw.读取日期形式为OTC91(MONYY5.)或OCT1991(MONYY7.)。
还有其他SAS内部输入格式可查HELP中的SASformatsandinformats。
格式输入是根据位置控制指针指明的列读取输入格式所指定的宽度w列,要注意的是位置指针不要省略,否则容易引起输入错误。
(3)自由格式
自由格式要求数据行上的数据与数据之间至少用一个空格隔开,语句中变量的次序与数据区中各变量的次序一一对应,每条观察值占一行,如果一行内安排了一条以上的观察值,INPUT语句结尾与分号之间用@@表示。
例:
dataC;
inputAB@@;
cards;
123456
;
run;
即生成临时数据集C
OBSAB
1l2
234
356
有两个变量三个观察值。
又例:
若C盘SAS目录下有个数据文件CLASS.DAT为:
1AliceF102188356.584.07865
2BeckaF104218365.398.08570
3GailF207118264.390.08967
4KarenF108238456.377.06876
5KathyF111058459.884.59280
6MaryF201148166.5112.05668
7SandyF112168551.350.58290
8SharonF211048162.5112.59383
9TammyF201108362.8102.56975
10A1fredM205208369.0112.58463
11DukeM102148363.5102.57480
12GuidoM212118167.0133.09486
13JamesM104028457.383.08179
14JeffreyM103158362.584.09081
15JohnM108128459.099.58670
16PhilipM209028072.0150.07889
17RobertM101228464.8128.07180
18ThomasM105118557.585.08567
19WilliamM206088166.5112.05777
我们用DATA步从该数据文件读取数据,建立一个临时性SAS数据集CLASS1,程序可写成:
dataclass1;
infile'c:
\sas\class.dat';
input@7name$10.@19group$2.@24birthdaymmddyy6.@33height4.1@39weight5.1MathEnglish;
run;
提交以后,我们建立了一个临时性的数据集文件CLASS。
该数据集有七个变量,前两个为字符型变量。
若只读取第5个至第15个观察值:
DATAclass2;
INFILE'c:
\sas\class.dat'FIRSTOBS=5obs=15;
INPUT@1num@7name$10.@19group$2.@24birthdaymmddyy6.
HeightweightMathEnglish;
RUN;
我们可以提交下列语句查看数据集:
PROCPRINT;
FORMATbirthdaymmddyy8.;
RUN;
如果我们要建立永久性的文件,并置放在C盘SAS目录下,首先需定义一个逻辑数据库名,提交上一节介绍的LIBNAME语句:
LIBNAMEabc'C:
\sas';
提交后,就可使用该数据库名,直至退出SAS系统。
DATAabc.class;
INFILE'c:
\sas\class.dat';
INPUTnumname$group$@24birthdaymmddyy6.heightweightmathenglish;
RUN;
三、修改数据的语句
1.SET语句
SET语句用于从已存在的SAS数据集中读取数据。
其一般格式为:
SETSAS-dat-set(s);
从SET语句中指定的SAS数据集中,自动地读取所有的变量和观察值,它将该数据集的程序数据矢量(PDV)拷贝到DATA语句指定的新数据集中去,所以能够从已存在的SAS数据集中建立一个DATA语句指定的新数据集或替换一个已存在的数据集。
例如,我们从abc.class数据集读取观察值,求平均分数并存放在sclass数据集:
datasclass;
setabc.class;
average=mean(math,english);
run;
在写DATA步时,可使用DROP=、KEEP=选项来选择变量。
假如DROP=、KEEP=选项被用在SET语句里,将控制从已存在的数据集中读那些变量到PDV中:
这时X变量不能参与该过程步内的运算。
假如用于DATA语句里,那就控制那些变量从PDV中写到新的数据集中去。
在这时X变量可以参与过程步内的运算,只在最后生成数据集时将其丢弃。
由于这两种情况的程序流程不一样,在编程时需特别注意。
2、赋值语句
赋值语句用于建立一个新的变量或对已存在的变量值进行修改。
其一般形式为:
variable=expression;
将表达式计算结果赋给变量。
例:
DATAA;
B=2;
C=B*3;
D=upcase('lm');
RUN;
3、条件赋值语句
条件赋值语句用于在不同的条件下对变量赋值。
其一般形式为:
IFexpressionTHENstatement;
ELSEstatement;
expression是有效的SAS表达式。
statement是可执行的SAS语句。
ELSE语句是可选择的。
SAS系统执行该语句时,先计算条件表达式的值,如果其值为‘真’,则执行THEN后面的SAS语句;如果其值为‘假’,则执行ELSE语句后面的语句。
例:
我们对SAS数据集ABC.CLASS修改一下,MATH大于75的加1,小于75的加2:
DATAclassnew;
SETabc.class(KEEP=namemathenglish);
IFmath>75THENmath=math+1;
ELSEmath=math+2;
RUN;
4、条件执行复合语句
条件执行复合语句是利用DO和END语句,在某一条件下执行—组语句。
其一般形式为:
IFexpressionTHEN
DO;
executable-statements;
END;
ELSE
DO;
executable-statements;
END;
因此上述的例子也可写成:
DATAclassnew;
SETabc.class(KEEP=namemathenglish);
IFmath>75THEN
DO;
math=math+1;
English=English+5;
END;
IFmath<=75THEN
DO;
math=math+2;
English=English+2;
END;
RUN;
当然,我们也可在建立数据集的时候进行修改:
DATAclassnew1;
INFILE'c:
\sas\class.dat';
INPUT@7name$10.@47math@51english;
IFmath>75THEN
DO;
math=math+1;
English=English+5;
END;
IFmath<=75THEN
DO;
math=math+2;
English=English+2;
END;
RUN;
5、循环语句
有时数据步需对一个观察值反复地执行某一部分语句时,就需要使用循环语句。
(1)DO指针变量=初值TO终值BY增量;
执行其他语句
END;
DO语句组第一次执行时,指针变量为初值,每执行到END语句时,指针变量加增量成为新的指针变量,然后与终值比较,直到指针变量等于终值时才停止执行DO语句。
如果只有初值则必须有一个语句标明何时跳出循环体。
如果未规定增量,其缺省值为1。
例:
DATA_NULL_;
DOI=1TO9;
DOJ=1TOI;
X=I*J;
PUT@(J*5)X@;
END;
PUT;
END;
RUN;
NULL表示建立一个空的数据集。
PUT语句是将内容写到LOG窗口内,第一个PUT语句是将X的值输出到指定的位置上,@(J*5)表示为输出指针位置,分号前的@是尾随符,表示在同一行上接着输出。
第二个PUT语句是空输出,作用是换行输出。
输出结果如下:
1
24
369
481216
510152025
61218243036
7142128354249
816243240485664
91827364554637281
(2)DOWHILE|UNTIL(expression);
executable-statements
END;
先计算条件表达式的值,满足DO语句的条件执行循环体内的语句,否则执行END后面的语句。
例:
DATA_NULL_;
N=0;
DOUNTIL(N>5);
PUTN=;
N=N+1;
END;
RUN;
例:
DATA_NULL_;
N=0;
DOWHILE(NLE5);
PUTN=;
N+1;
END;
RUN;
6、OUTPUT语句
DATA步中,OUTPUT语句把观察值输出到数据集中去。
其一般格式为:
OUTPUT;
OUTPUTSAS-data-set;
没有指明数据集名,那么观察值
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SAS 软件 深入 应用
![提示](https://static.bdocx.com/images/bang_tan.gif)