SAS入门教程
第一章 SAS系统概况
SAS,Statistic Analysis System,系统是世界领先的信息系统~它最初的用于统计分析~经过不断发展和完善而成为大型集成应用软件系统;具有完备的数据存取、管理、分析和显示功能。在数据处理和统计分析领域~SAS系统被誉为国际上的
软件系统。
SAS系统是一个模块化的集成软件系统。SAS系统提供的二十多个模块,产品,可完成各方面的实际问
~功能非常齐全~用户根据需要可灵活的选择使用。
, Base SAS
Base SAS软件是SAS系统的核心。主要功能是数据管理和数据加工处理~并有报表生成和描述统计的功能。Base SAS软件可以单独使用~也可以同其他软件产品一起组成一个用户化的SAS系统。 , SAS/AF
这是一个应用开发工具。利用SAS/AF的屏幕
能力及SCL语
言的处理能力可快速
开发各种功能强大的应用系统。SAS/AF采用先进的OOP,面向对象编程,的技术~是用户可方便快速的实现各类具有图形用户界面,GUI,的应用系统。
, SAS/EIS
该软件是SAS系统种采用OOP,面向对象编程,技术的又一个开
发工具。该产品也称
1 / 29
SAS入门教程
为行政信息系统或每个人的信息系统。利用该软件可以创建多维数据库,MDDB,~并能生成多维报表和图形。
, SAS/INTRNET
, SAS/ACCESS
该软件是对目前许多流行数据库的接口组成的接口集~它提供的
与外部数据库的接口是透明和动态的。
2 / 29
SAS入门教程
第二章 Base SAS软件 第一节 SAS编程基础
SAS语言的编程规则与其它过程语言基本相同。
SAS语句
一个SAS语句是有SAS关键词、SAS名字、特殊字符和运算符
组成的字符串~并以分
号,,,结尾。
注释语句的形式为:/*注释内容*/ 或 *注释内容。
二、 SAS程序
一系列SAS语句组成一个SAS程序。SAS程序中的语句可分为两类步骤:DATA步和PROC步。这两类步骤是所有SAS程序的模块。通常用DATA步产生SAS数据集~而用PROC步对SAS数据集内的数据进行分析处理并输出结果。
SAS程序是在Editor窗口采用全屏幕编辑方式输入。当程序输入完毕后~就可以提交给SAS系统执行~在菜单中选择Submit或按F3键都可以运行程序~也可以只提交一部分语句。LOG窗口显示程序执行过程中
的信息~它包括执行的语句~生成的数据集中变量的个数及记录的个数~每一步花费的时间及出错信息等。SAS过程产生
3 / 29
SAS入门教程
的输出显示在OUTPUT窗口。
SAS数据集
SAS数据集相当于其它数据库系统的表,Table,,每一行称为一
个观测~相当于其它数
据库系统的一条记录,每一列称为一个变量。
SAS的变量只有两种类型:数值型和字符型,变量的长度缺省时为8个字节~用关键字LENGTH定义变量长度,可以对变量的输入、输出格式进行定义~用关键字INFORMAT、FORMAT来分别定义,还可以给变量加标签~标签是一个代替变量名的描述性标识~可以在一些确定的SAS过程中代替变量名被打印出来~用关键字LABEL定义。
SAS数据集在系统中以文件的形式存在~扩展名是.sas7bdat。
每次启动SAS系统后~系统自动开辟一个库名为WORK的临时
存贮区~用来存贮DATA
步或其它过程生成的临时数据集。一旦退出SAS系统~这个临时存贮区就被删除~其中所有的临时数据文件也被删除。
为了创建永久的数据集~必须给这个数据集规定存贮的地方和名字两部分~第一部分称为库标记或逻辑库名,Libref,~它总是使用LIBNAME语句把库标记和一个目录联系起来~用来指示数据集存贮的地方。例如:
libname develop ‘d:\projects\develop\data’
4 / 29
SAS入门教程
develop.t_itemsum表明数据集t_itemsum存贮在‘d:\projects\develop\data’目录下。tmp 或work.tmp表明数据集tmp存贮在临时存贮区中。
SAS表达式和SAS函数
SAS语言的表达式与其它过程语言略有不同。
SAS语言中数值型变量的缺失值是一个小数点,.,~字符型变量
的缺失值是空,′′,。
在一个四则运算的表达式里面~如果有一个缺失值~那么整个运算的结果就是’.’,如果用户不想让缺失值参加算术运算~可使用SAS的样本统计函数~如SUM,,~MEAN,,等。如果除法运算的除数为0~那么运算的结果也是’.’。
表示时间的变量在数据集里经常被定义为数值型~0代表的是
1960年1月1日~1代表
的是1960年1月2日~-1代表的是1959年12月31日~以此类推。我们可以用FORMAT定义时间的输出格式~如:yymmdd10.这种格式显示的时间形式如’2001-05-01’。时间常数可以表示成'01MAY2001'd的形式~如:if occdate=’ 01MAY2001’d。
算符’| |’连接两个字符值~连接算付不清里开头和结尾的空格~如:如果itemid=’622 ’~itemname=’ 逾期贷款’~那么itemid | | ‘.’| | itemname=’ 622 . 逾期贷款’。如果要去掉空格~就要使用SAS函
5 / 29
SAS入门教程
数TRIM和LEFT~trim(left(itemid)) | | ‘.’| | trim(left(itemname))=’ 622 .逾期贷款’。
下面是一些常用的函数:
字符函数:
TRIM(s):去掉s尾部空格,
LEFT(s):字符串s的表示式采用左对齐~即去掉s开头的空格,
SUBSTR(s,p,n):从字符串s中的第p个字符开始抽取n个字符的子串。
LENGTH(s):给出字符串s的长度,
INDEX(s,s1):搜寻字符串s1在字符串s中的位置,
INPUT(s,informat):
字符s的输入格式为 informat ~如:
INPUT(‘1960-01-01’,yymmdd10.)=0,
PUT(s,format):
将s 按format的格式输出~如:
PUT(0,yymmdd10.)=’1960-01-01’~结果一定为字符型,
SYMPUT(‘x1’,x2):把x2的值赋给宏变量x1
SYMGET(‘x’):取得宏变量x的值,
时间和日期函数:
6 / 29
SAS入门教程
DATE( ):取当前日期,
DATETIME( ):取当前日期和时间,
YEAR(date)、MONTH(date)、QTR(date)、DAY(date):
分别取date表示的年、季度、月份、日。
INTX(in,from,nu):
按给定的时间间隔in—年,year,、季度,qtr,、月份,month,、
日,day,~从日期from~推算出nu个时间间隔后的日期的第一天。
如:
PUT(INTNX(‘qtr’,INPUT(’1960-02-01’,yymmdd10.),2),yymmdd10.)=’1960-07-01’
第二节 DATA步,数据步,
DATA步是用DATA语句开始的一组SAS语句~用来创建SAS数据集。 本小节将介绍一些在DATA步中常用的SAS语句。
创建SAS数据集及输出文件或报表
1. 数据在作业流中
就是用SAS语句从作业流中输入数据来产生SAS数据集。一
般的形式为:
DATA 语句, /*给出要产生的数据集的名字*/
INPUT 语句, /*对每个变量给出名字
7 / 29
SAS入门教程
及类型*/
,用于DATA步的其它SAS语句,
CARDS, /*标志数据行开始*/
[数据行]
,
例:data tmp;
input sex $ x1-x3;
cards;
F 1 2 3
M 4 5 6 ;
2. 数据来自外部文件
从磁盘上读入数据文件产生SAS数据集。一般的形式为:
DATA 语句, /*给出要产生的数据集
的名字*/
INFILE 语句, /*打开包含数据的
外部文件*/
INPUT 语句, /*对每个变量给出名字及类型*/
,用于DATA步的其它SAS语句,
RUN,
例:data tmp;
infile ‘c:\f1.dat’,
8 / 29
SAS入门教程
input sex $ x1-x3;
z=(x1+x2+x3)/3;
run;
3. 数据来自其他SAS数据集
由已存在的数据集创建新的数据集。
DATA 语句, /*给出要产生的数据
集的名字*/
SET | MERGE | UPDATE| MODIFY语句, /*给出已存在的
数据集的名字*/
,用于DATA步的其它SAS语句,
RUN,
例:data tmp;
set tmp;
if sex=’F’;
run;
4. 把SAS数据集转换为外部数据文件或输出报表
产生外部数据文件或在打印机上输出报表。
DATA _NULL_, /*_NULL_意味着不产
生数据集*/
INPUT和CARDS | INFILE 语句
或者SET | MERGE | UPDATE| MODIFY语句, /*为输
出提供数据*/
9 / 29
SAS入门教程
FILE 语句, /*输出报表或存贮文
件*/
PUT 语句, /*要输出的变量*/
,用于DATA步的其它SAS语句,
RUN,
例:data _null_;
set tmp;
file ‘c:\f1.dat’; (或者file ‘prn’;)
put x1 x2;
run;
二、 DATA步流程
DATA步开始
NO
YES
是否还有没有处理的观测,
SAS数据集形成。 开始下一个DATA 用INPUT或SET,MERGE,UPDATE和MODIFY语句读入一个观测 步或PROC步。
(图) 在DATA步内部运行的流程图
10 / 29
SAS入门教程
用一些程序语句对观测进行处理
程序语句结束或用OUTPUT语句输出当前观测到SAS数据集
三、 用在DATA步的文件操作语句
,( DATA语句和SET语句
DATA语句表示一个数据步的开始~并给出正在创建的数据集
的名字。SET语句给
出用来创建新的数据集的已存在的数据集的名字。
例:data year1999 year2000 year2001;
set year qtr month;
if year=1999 then output year1999;
else if year=2000 then output year2000;
else if year=2001 then output year2001;
11 / 29
SAS入门教程
run;
,( MERGE语句,合并语句,
MERGE语句是把两个或两个以上的数据集中的观测合并为新
生数据集中的一个
观测。
例:data data3;
merge data1(in=in1) data2(in=in2);
by x1; /*数据集必须先按变量x1排序
*/
if in1 and in2; /*变量x1取当前值的观测在data1和
data2中都存在*/
run;
?( UPDATE语句,更新语句,
UPDATE语句是用一个修改数据集中的观测来修改一个主数
据集。
例:data new;
update oldmaster trans;
by id; /*数据集必须先按变量id排序
*/
run;
12 / 29
SAS入门教程
,( BY语句
BY语句在DATA步中用以控制SET~MERGE~UPDATE或MODIFY语句的操作~并且建立特殊的分组变量。 例:proc sort data=degress;
by state city;
run;
在DATA步中~SAS系统对每个BY组,含有BY值的所有观测组成一个BY组,创建两个临时变量:FIRST.variable和LAST.variable~他们用来区别每个BY组的第一个和最后一个观测。当某个观测在BY组中是第一个观测时~FIRST.variable的值置为1,而这个BY组的其它所有观测的FIRST.variable的值为0。类似地~当某个观测在BY组中是最后一个观测时~LAST.variable
的值置为1,而这个BY组的其它所有观测的LAST.variable的值为0。
用在DATA步的运行语句
,( DELETE语句,删除语句,
DELETE语句告数SAS系统停止处理当前的观测。这个观测
不会被输出到正被创
建的数据集中~而且系统返回到这个DATA步的开头处理其它观
测。
13 / 29
SAS入门教程
例:data tmp;
set tmp;
if sex=’F’ then delete;
run;
,( STOP语句,停止语句,
用来停止处理当前的DATA步~正被处理的那个观测没有添加
到数据集上。
例:data out;
set in;
if _n_=11 then stop; /*生成的数据集中将只包含10
个观测*/
run;
,( WHERE语句
从输入数据集中读满足条件的观测进行处理。
例:data out;
set in;
where sex=’F’;
run;
14 / 29
SAS入门教程
,( OUTPUT语句,输出到数据集语句,
OUTPUT语句告诉SAS系统输出当前的观测到正被创建的数
据集中。
例:data out1 out2;
set in;
if sex=’F’ then output out1;
if sex=’M’ then output out2;
run;
用在DATA步的控制语句
,( DO语句,循环语句,
5. 简单DO语句
if x<5 then do;
x=x-5;
y=y+5;
end;
6. 循环DO语句
do I=1 to 5 do;
x=x-5;
y=y+5;
end;
15 / 29
SAS入门教程 7. DO WHILE 语句
do while x<5;
x=x-5;
y=y+5;
end;
8. DO UNTIL 语句
do until x>=5;
x=x-5;
y=y+5;
end;
,,( SELECT语句,选择语句,
例:select(x);
when (0) put ‘x=0’;
when (1) put ‘x=1’;
otherwise put ‘x=-1’;
end;
或写成下面的形式:
select;
when (x=0 || x=1) put ‘x=’ x;
otherwise put ‘x=-1’;
end;
16 / 29
SAS入门教程 ,,( IF语句,条件语句, 例:if x=1 then do; /*当条件成立时~执行下面一
个DO组*/
x=0;
put ‘x=0’;
end;
else do; /*当条件不成立时~执行下面另一
个DO组*/
x=1;
put ‘x=1’;
end;
用在DATA步的信息语句 ,,( FORMAT语句,格式语句,
规定变量的输出格式。
例:data _null_;
a=0;
b=1000000.00;
format a data7.
b comma16.2;
put a b;
17 / 29
SAS入门教程
run;
程序执行结果在LOG窗口输出:01JUN1960 1,000,000.00, ,?( LENGTH语句,长度语句,
定义数据集中变量的名称、类型和长度
例:data new;
length a b $10 c d 8;
stop;
run;
创建一个新的数据集new。含有四个变量~a和b是字符型~长度为10个字节,c和d是数值型~长度为8个字节。数据集中没有观测。
即使不是用LENGTH语句~DATA步中的任何一个赋值语句左边的变量也会被作为正被创建的数据集中的一个变量被输出到数据集中。
例:data new;
length x 8;
do I=1 to 5;
x=I;
output;
end;
run;
18 / 29
SAS入门教程
生成的数据集new中有五个观测和两个变量x、i。
,,( LABEL语句,标签语句,
对变量给出标签。这个标签在SAS 数据集中同变量名一起被
存贮~而且可以通过许多SAS过程被打印输出。
例:label occdate=’数据日期’
unitname=’分行名称’;
,,( DROP语句,删掉变量语句,
用来规定不包含在SAS数据集中的变量。
例:data new(drop=a);
set old(drop=b);
run;
如果数据集old中含有变量a,b,c~那么数据集new中只含有变量c。
,,( KEEP语句,保留变量语句,
用来规定包含在SAS数据集中的变量。
例:data new(keep=a b);
set old;
run;
不管数据集old中含有几个变量~数据集new中只含有变量a
19 / 29
SAS入门教程
b。
,,( RENAME语句,换名语句,
例: data new(rename=(x1=y1 x2=y2)); data
new;
set old; set
old;
x1=x1-5; 等价于:
rename x1=y1 x2=y2, run;
x1=x1-5;
run;
因为上面的例子中变量的新名字在输出数据集中才起作用~在
当前的DATA步的程序语句中应仍使用老名字。而在下面的例子
中~应使用新名字:
data new;
set old(rename=(x1=y1 x2=y2));
y1=y1-5;
run;
,,( RETAIN语句,保留语句,
该语句使得变量值在DATA步从当前这次到下一次重复时被
20 / 29
SAS入门教程
保留。
例:data new;
set old;
length sum 8;
retain sum;
if _n_=1 then sum=x;
else sum=sum+x;
run;
在新的数据集中增加变量sum~sum的值等于第一条观测到当前观测的变量x的值
的累加。如果没有retain语句~那么第一条观测以后的sum值均为缺失值。
第三节 全程语句
全程语句可以用在SAS程序的任何地方。
,( FILENAME语句,文件名语句,和
%INCLUDE语句
FILENAME语句用文件标记指示一个外部文件的全名字,目
录加上文件名,。%INCLUDE语句被用来取出SAS语句和数据行~
相当于其它语言中的子程序调用。
21 / 29
SAS入门教程
例:filename count d:\projects\develop\pgm\count.sas;
%include count; /*执行程序
d:\projects\develop\pgm\count.sas */
第四节 PROC步,过程步,
PROC步是用PROC语句开始的一组或几组SAS语句。在
PROC步~可以通过过
程的名字来调用过程—一个已经为你写好的程序。下面介绍一些常用的SAS过程:
,( SQL过程,结构查询语言过程,
将用结构化查询语言编写的SQL语句放到SAS系统的PROC SQL
语句的后面~不需要
使用RUN语句~当你提交该过程后~SQL语句便被执行。 例:proc sql;
create table new as
select x,y,z
from old
where x>0;
22 / 29
SAS入门教程
,( SORT过程,排序过程,
SORT过程常用于将数据集分类排序~以便其他SAS过程通过
使用BY语句可以直
接调用它~在对SAS数据集进行合并和更新之前~也必须先进行
分类排序。
例:proc sort data=develop.t_accinfo out=project_info nodupkey;
by unitid descending projectid;
run;
该过程对数据集develop.t_accinfo先按unitid的升序排列~在每一个unitid组里面再按projectid的降序排列 ~生成数据集project_info ~nodupkey表示删除by值相同的观测。如果没有指定out=数据集~则将排序后的结果输出到原来的数据集中。 ?( APPEND过程,附加过程,
该过程将一个SAS数据集的观测附加到另一个SAS数据集的
后面。
如果用DATA步去连接两个数据集~SAS系统必须在处理完
两个数据集中的所有
观测后再产生一个新的数据集。APPEND步避免处理原始数据集
中的数据~直接把新
观测添加到原始数据集的后面。
例:proc append base=old data=new;
23 / 29
SAS入门教程
run;
该过程用于将DATA=数据集中的观测添加到BASE=的数据集中。如果两个数据集中的变量名称或长度不同~要在PROC语句中加FORCE选项。
,( DATASETS过程,数据库管理过程,
该过程用于对SAS数据库中的SAS文件进行列表、拷贝、换
名、添加和删除等操
作。
,( CONTENTS过程,内容过程,
该过程提供SAS数据库中关于SAS文件的有关信息。如:文
件的名称、类型、创
建时间、修改时间、观测数、变量、索引等。并自动输出到OUTPUT窗口。可以用OUT=数据集将信息输出到一指定的数据集中。 例:proc contents data=develop.t_unitdef out=info;
run;
,( FORMAT过程,定义格式过程,
在SAS系统中~用户可以使用PROC FORMAT过程定义自己
的格式。各是可以被
赋予:
24 / 29
SAS入门教程
, 单个数字:
proc format;
value sexfmt 1='Female'
2='Male'
other='Miscoded';
run;
, 某一数字范围:
proc format;
value boardfmt low-49='Below Average'
50-99='Average'
100-high='Above Average';
run;
, 字符、字符串或某一范围的字符
proc format;
value $grade 'A'='Good'
'B'-'D'='Fair'
'E','F'='Poor'
other='Miscoded';
run;
,( SUMMARY过程,概括过程,
例:proc summary data=personal nway;
class sex;
var salary;
output out=personal(drop=_freq_ _type_) sum=salary;
run;
该过程按sex的值分组~对每组的salary的值求和。
25 / 29
SAS入门教程
,( TABULATE过程,制表过程,
PROC TABULATE过程可以产生格式化的汇总表格。最简单
的TABULATE过程必
须定义下列要素:
, CLASS语句定义分类变量
, VAR语句定义分析变量
, TABLE语句定义表格的结构和格式,操作符:逗号—转另一
维~空格—表格连排~星号—交叉组合分组,
例:proc tabulate data=personal;
class sex;
var salary;
table sex,
salary*mean;
run;
将输出如下的表格:
salary
mean
sex
52.00 F
M 55.00
26 / 29
SAS入门教程
第五节 SAS宏功能
一、SAS宏变量
定义宏变量:
%let macro-variable-name=value;
或:
call symput(‘macro-variable-name’, value);
引用宏变量:(就是用宏变量的内容直接代替宏变量名)
& macro-variable-name 二、SAS宏调用
相当于其他语言的函数。其定义的一般形式如下:
%MACRO macro-name (parameters);
macro-text
%MEND macro-name;
引用宏调用的形式如下:
%macro-name(parameter-values);
第六节 常见问题分析
1. 判断记录集是否为空
?方法一:
%let isEmpty=1;
27 / 29
SAS入门教程
data _null_;
set &dataset nobs=rows;
if rows>0 then call symput('isEmpty',0);
stop;
run;
?方法二:
%let isEmpty=1;
proc contents data=&dataset out=tmp noprint;
run;
data _null_;
set tmp;
if nobs>0 then call symput('isEmpty',0);
run;
第七节 练习
28 / 29
SAS入门教程
29 / 29