资源描述
SAS数据集
SAS系统使用的数据文件称为SAS数据集。
1. SAS的工作环境与SAS程序的结构
1.1SAS的工作环境
主要有四个窗口:
PROGRAM EDIT窗口:用于程序的编写、运行和调试。
LOG窗口:用于监视程序的执行过程,提示程序运行过程的各种信息。
记录了SAS程序运行的全部情况,如程序语句的语法错误,运行中的逻辑错误和警告信息,运行时使用的数据集,建立的库文件,以及运行时间等。
OUTPUT窗口:用于显示程序运行的结果。
显示程序的统计分析结果,还可以在窗口对计算结果进行输入、输出、编辑、修改,以及文件格式的转换等操作。
GRAPH窗口:用于图形展示。
还可以在窗口对图形进行输入、输出、编辑、修改,以及图形格式的转换等操作。
另外,
Explorer窗口用于显示SAS库(SAS系统命名的库名与磁盘某文件夹间的关联)及其SAS数据集。
Results窗口用于显示SAS程序运行成功时程序输出结果的目录。
SAS系统还有许多窗口,每个窗口都有其特定功能。根据需要可以关闭窗口,也可以通过主菜单View的下拉菜单打开或切换窗口。
运行程序的方式有:
Submit:运行全部程序。
Submit top line:运行程序的前n行。
程序运行后系统自动删除已经运行完毕的语句,运行结果显示在OUTPUT窗口,执行过程的各种信息显示在LOG窗口。程序全部运行完毕后PROGRAM EDIT窗口的内容被清除,如果用户希望继续修改或调试该程序,可通过主菜单Locals项下的Recall text选项重新取出程序。
1.2 SAS程序的结构
SAS程序采用模块化结构,模块之间相互独立,每个模块完成一个任务。模块可分为两种类型:一种类型是数据模块,数据模块以英文单词data作为开始语句。另一种是程序模块,程序模块以proc(即英文单词procedure的前四个字母)作为开始语句。模块中的语句用“;”分隔,同一个语句的不同项之间用一个以上的空格分隔。大多数模块用语句“run;”作为结束语句,也有一些模块用语句“quit;”作为结束语句。在一个程序中可以包含多个数据模块和程序模块,模块的位置是任意的。程序按照语句出现的先后顺序执行。
除了数据模块和程序模块之外,用户还可以使用说明语句定义全程量。说明语句可以出现在程序的开始,或者任意两个模块之间,说明语句定义的量的作用范围是该语句后面的所有模块。
例1是一个SAS程序的例子,程序中包含一个数据模块,两个程序模块。在数据模块中输入了对四个变量s,x,y,z三次观测的数据,即建立了一个包含三个记录的数据文件example。S是字符串变量,x,y,z是数值变量。过程proc的功能是将数据文件example的内容显示在OUTPUT窗口。过程means的功能是计算变量x,y(由var指定的变量)的描述性统计量。
[例1]
Data example;
Input s $ x y z;
cards;
A 1 2 3
B 4 5 6
C 7 8 9
run;
proc print data=example;
run;
proc means data=example;
var x y;
run;
1.3 SAS程序的语法
编写程序时必须遵循所使用的软件的语法规则,SAS程序的语法规则可以归纳为以下几条:
标识符或数据之间至少用一个以上的空格分隔,例如:input s$。
每个语句用分号作为结束标志。
变量名或其他名称最多包含8个符号,并且第一个字符为英文字母,名称中不能有空格,或SAS系统的保留符号,如:“-”,“.”,“,”,“;”,“…”,“$”等。
SAS程序可以处理带有缺失数据的文件,数据缺失值用“.”表示。
SAS程序只处理数值和字符串两种类型的变量,为了和数值变量相区别,输入语句中字符串变量名使用“$”作为后缀。
程序中可以包含注释语句,注释语句以“/*”作为一行的开始符号,表示该行为注释语句。
除数据外,SAS程序不区分英文字母大小写。
1.4 常用的运算符号
名称 符号 例子
加号 + A=X+Y+Z
减号 — B=X-Y-Z
乘号 * C=X*Y*Z
除号 / D=X/Y
乘方 ** E=X**2
等于 = A=X+Y+Z
不等于 ^= B^=X-Y-Z
大于 > C>X*Y*Z
小于 < D<X/Y
大于等于 >= E>=X+Y+Z
小于等于 <= F<=X+Y+Z
属于 IN G IN (X Y Z)
与 &(AND) A<B & B<C 或A<B AND B<C
或 | (OR) B=1|B=2或B=1 OR B=2
非 ^(NOT) ^C=0 或NOT C=0
1.5 系统函数
SAS系统提供了丰富的系统函数,用户可以在程序中直接使用这些函数完成各种计算和处理,从而大大提高工作效率,。
算术函数
三角函数
数学函数
分位数函数
随机函数
概率与密度函数
非中心函数
样本统计函数
截取函数
金融函数
字符函数
日期和时间函数
变量函数位操作函数
特殊函数
外部文件函数
数据集函数
库和目录函数
2. 临时数据集和永久数据集
2.1临时数据集
临时数据集是程序在执行过程中建立的临时数据文件,退出程序以后计算机不保存临时数据集中的数据。
【例2】建立一个临时数据集,存放表1-1中的数据。
Data sale;
Input name $ sales region $ type $;
Cards;
Stafer 9664 east p
Young 22969 east p
Stride 27253 east p
Topin 86432 east c
Spark 99210 east c
Vetter 38928 west c
Curci 21531 west p
Marco 79345 west p
Greco 18523 west p
Ryan 32915 west p
Tomas 42109 west p
Thalman 94320 south c
Moore 25718 south p
Allen 64700 south c
Steiam 27634 south p
Farlow 32719 south p
Smith 38712 south p
Wilson 97214 south c
Run;
Data语句是数据模块的起始语句,data后面跟随的是创建的数据集的名字,这个例子建立的临时数据集的名字是sale。
Input语句说明要输入的数据项,或者称为变量。变量名之间用空格分开,这个例子中有四个变量name,region,type,sales,除了sales外其余的变量都是字符串类型,所以变量名后要加后缀$。
该数据集中包含对四个变量name,region,type,sales的18次观察值,也可以说包含18条记录。
Cards语句用来说明它的后面跟随的是数据。
Run语句是过程结束语句。
这个程序建立了临时数据集sale。程序运行结束后,sale将不复存在。观察这段程序可以看到,这个程序把要处理的原始数据放在程序内部。当数据量很小时,这种写法很方便。但是,当数据量很多,程序结构就不清晰,会给程序的调试带来不便。另外,数据放在程序内部的做法,使得这些数据只能供一个程序使用,限制了数据的使用范围,不利于数据的共享。因此,当数据量大时,应该建立永久数据集。
2.2 永久数据集
SAS永久数据集是以文件的形式存储在磁盘上的数据文件。使用永久数据集时,除了要说明数据集的名称外,还要说明数据文件在磁盘上的位置,即文件的路径。下面利用表1-1中的数据建立永久数据集。
【例3】建立一个永久数据集
Libname path “a:mydir”;
Data path.sale;
Input name$ sales region$ type$ @@;
Cards;
Stafer 9664 east p Young 22969 east p
Stride 27253 east p Topin 86432 east c
Spark 99210 east c Vetter 38928 west c
Curci 21531 west p Marco 79345 west p
Greco 18523 west p Ryan 32915 west p
Tomas 42109 west p Thalman 94320 south c
Moore 25718 south p Allen 64700 south c
Steiam 27634 south p Farlow 32719 south p
Smith 38712 south p Wilson 97214 south c
Run;
Libname是一个说明语句,说明在后面程序中使用path代表磁盘目录a:\mydir,程序使用的数据文件存储在该目录下。
Data path.sale说明了一个名为sale的永久数据集,永久数据集的名称包含两部分,前一部分是我就路径,后一部分是文件名,中间用“。”号分隔。
Input语句结尾的@@表示一个数据行包含多个记录,当数据较多时用这种格式输入数据比较方便。
2.3 使用过程建立永久数据集
SAS系统还提供了交互式建立永久数据集的工具。下面我们使用SAS/FSP模块提供的过程FSVIEW来建立永久数据集。
【例4】使用过程FSVIEW来建立永久数据集
Libname path ‘a:\mydir’;
Proc fsview new=path.f;
Run;
运行上面的程序后,将进入FSVIEW工作窗口,该窗口包含内容如下:
Name type length label format (informat)
用户可以在这个窗口中完成数据集的定义工作,具体的定义方法是:
在name下定义数据集中使用的数据项的名称。
在type下定义数据项的数据数据类型,输入N表示数值类型,输入$表示字符串类型。
在length下定义数据的长度,缺省值为8。
在lable下定义数据显示的标号。
在format下定义数据的输出格式。
在informat下定义数据的输入格式。
使用FSVIEW过程还可以编辑已经建立的SAS数据集,例如,执行下面的程序后将进入数据集a:\mydir.f的编辑界面,在编辑界面可以进行数据录入和修改操作。
【例5】使用FSVIEW过程编辑已经建立的SAS数据。
Libname path’a:\mydir’;
Proc fsview data=path.f;
Run;
3. 使用非SAS格式的数据文件
在SAS系统中可以使用其他应用软件建立的数据文件,由于这些数据文件的存储格式和SAS数据文件的存储格式不同,所以使用前应利用SAS系统提供的数据转换程序进行处理。下面介绍最常见的文本格式的数据文件的使用方法,其他数据格式文件的转换方法请参阅有关的SAS手册。
【6】从文本格式的数据文件sale.dat读取数据,建立SAS数据集。
Data sale;
Infile ‘a:\mydir\sale.dat’;
Input name$ sales region$ type$;
Run;
Infile语句打开存储在a:\mydir目录下的文本格式的数据文件sale.dat。
Input语句读入数据。
注意:原始数据文件中每行应包含四个数据项,数据之间用空格分隔。
4. 数据的修饰
数据的修饰包括新变量的生成,对数据文件进行投影、筛选、连接等操作。对数据文件进行修饰可以得到满足分析需要的数据。
4.1 赋值语句
使用赋值语句可以为变量赋值,生成新的数据项。SAS系统提供了丰富的函数,在赋值语句中可以充分利用这些函数对原始数据进行加工,生成新的数据项。
【例7】输入x,y,z三个变量的观测数据,并生成新的变量s。
Data a;
Input x y z;
S=x+y+z;
Cards;
(略)
Run;
上边的程序每输入变量x,y,z的一次观测,就计算一次x+y+z,并把结果赋给s,程序最终建立了包含x,y,z,s 四个数据项的临时数据集a。
【例8】输入变量x,y,z,计算x^2+y^2+z^2的平方根,并将计算结果赋给变量r。
Data a;
Input x y x;
R=sqrt(x*x+y*y+z*z);
Cards;
(略)
Run;
【例9】利用条件语句和赋值语句建立新变量。
Data sale;
Input name$ sales region$ type$;
Select;
When(sales<20000) group=10000;
When(20000<=sales<40000) group=30000;
When(40000<=sales<60000) group=50000;
When(60000<=sales<80000) group=70000;
Otherwise group=90000;
End;
Cards;
(数据同表1-1)
Run;
这段程序利用赋值语句建立了一个变量group,它是对变量sales进行分组后的组中值。
Select语句称为多路分支语句,它的工作方法是先计算when后面的条件语句,如果条件语句的值为真,则执行条件语句后面的内容,然后跳转到end语句。为假,则执行otherwise后面的语句。
Select语句的另一种用法为:
Select 表达式;
When (值或表达式)语句1;
……
When (值或表达式)语句n;
Otherwise 语句;
End;
如果select后面表达式的计算结果等于某个when语句后面的值或表达式结果,则程序执行该语句对应的语句,然后跳转到end语句。如果所有when语句的值或表达式的计算结果均不等于select后面表达式的计算结果,则程序执行otherwise后面的语句。
4.2 数据项投影
SAS系统提供的对数据项进行投影操作的语句有keep和drop。下面两段程序功能相同,都是建立数据集b时,只保留x和y数据项。
【例10】建立数据集b,只保留x和y数据项。
Data a;
Input x y z;
……
Run;
Data b (keep=x y);
Set a;
Run;
【例11】建立数据集b,并从中删除数据项z。
Data a;
Input x y z;
……
Run;
Data b;
Set a;
Drop z;
Run;
语句set a 说明将数据集a中的数据连接到数据集b的末尾。
Keep选项指示程序在连接时只保留数据项x和y。
Drop语句说明程序在连接后从数据集b中删除数据项z。
4.3 记录的筛选
SAS系统提供了对文件进行筛选操作的语句。下面是对记录进行筛选的例子。
【例12】从表1-1中所列的销售类型为c的记录。
Data sale;
Input name$ sales region$ type$;
If type =‘p’then delete;
Cards;
(数据同表1-1)
Run;
这段程序每输入一条记录就判断本次观测的机器类型是否为p,如果是删除这次观测,最终程序建立的数据集sale中只有机器类型为c的记录。
If是判断语句,if后面是条件,当条件为真时,程序执行then后面的语句。If语句的另一种结构为if<条件>then<语句1>else<语句2>,当条件为真时,程序执行语句1,否则执行语句2.
Delete是删除语句,执行一次delete语句,数据集的当前记录被删除。
下面的程序根据表1-1建立了两个数据集,sale1中包含销售类型为打印机的有关记录,sale2中包含销售类型为计算机的有关记录。
【例13】分别建立包含销售类型为计算机和打印机的数据集。
Data sale1 sale2;
Input name$ sales region$ type@ ;
If type =’p’then output sale1 ;else output sale2;
Cards;
(数据同表1-1)
Run;
Output 语句的功能是将当前记录连接到指定数据集的末尾。
4.4 连接数据集
根据分析的需要,可以将多个数据集横向或纵向连接为一个数据集。连接可以是垂直连接,也可以是水平连接。
4.4.1 垂直连接数据集
垂直连接是将一个数据集中的数据连接到另一个数据集的末尾,完成垂直连接的语句为set。下面是完成数据集a和b的垂直连接的一个例子。
【例14】已经存在两个数据集a和b,它们的内容如下:
数据集a中的数据为: 数据集b中的数据为:
6 9 mouse 1 5 mouse
1 2 print 6 3 computer
2 7 scaner
执行下面的程序,
Data a;
Set b;
Run;
运行后数据集a中的内容变为:
6 9 mouse
1 2 print
2 7 scane
1 5 mouse
6 3 computer
【例15】使用set语句,利用数据集a,b建立永久数据集a:\mydir.c。
Libname path ‘a:\mydir’;
Data path.c;
Set a b;
Run;
4.4.2 水平连接数据集
使用merge语句可以水平连接两个数据集。连接数据文件时特别要注意两个文件记录之间的对应关系。
【例16】表5和表6表示数据集a和b,它们分别记录了学生的专业和家庭收入情况,将它们连接成一个新的数据文件。
表5 学生专业情况 表6学生家庭收入情况
学号 姓名 专业 班级 学号 家庭收入 家庭人口
34200 miaojing xinxi 8701 34108 3500.00 3
35012 wangmin tongji 2001 34200 6200.00 4
35228 dinghui xinxi 8701 34228 2400.00 4
35618 wangjian tongji 9019 35618 1500.00 3
36120 liufang jinrong 2006 36120 1800.00 3
36336 lanrui jinrong 2006 36336 2700.00 3
使用下面的程序连接表5和表6生成新的数据集,见表7.
Data a;
Merge a b;
Run;
新数据集的内容如表7所示。
学号 姓名 专业 班级 家庭收入 家庭人口
34200 miaojing xinxi 8701 3500.00 3
35012 wangmin tongji 2001 6200.00 4
35228 dinghui xinxi 8701 2400.00 4
35618 wangjian tongji 9019 1500.00 3
36120 liufang jinrong 2006 1800.00 3
36336 lanrui jinrong 2006 2700.00 3
4.5 使用修饰数据
5.
展开阅读全文