SAS 软件与统计应用实验
实验 2 SAS编程基础
SAS 语言和其它计算机语言一样,也有其专有的词汇(即关键字)和语法。关键字、名
字、特殊字符和运算符等按照语法规则排列组成SAS 语句,一个SAS 程序由若干数据步、过程步组合而成,而每一个程序步通常由若干语句构成。SAS 程序是在Editor 窗口中进行编辑,提交运行后可以在Log 窗口中显示有关信息和提示,在Output 窗口显示运行的结果。
2.1实验目的
通过实验了解 SAS 编程的基本概念,掌握 SAS 编程的基本方法,掌握 SAS 数据步对数据集的管理和对数据的预处理。
2.2实验内容
一、建立逻辑库与数据集,包括逻辑库的建立、直接输入数据建立数据集与读取外部数
据文件建立数据集。
二、数据文件的编辑与整理,包括数据集的横向合并与纵向合并、数据集内容的复制、
变量的增加与筛选、数据集的拆分和数据的排序。
2.3实验指导
一、建立逻辑库与数据集
1. 建立逻辑库
【实验 2-1】编程建立逻辑库。
(1) 首先在 D 盘创建一个文件夹,如D:\SAS_SHYAN\SAS 数据集。
(2)建立逻辑库 mylib ,编辑并运行下面程序语句即可。
libname mylib "D:\sas_shiyan\sas 数据集 ";
2.直接输入数据建立数据集
【实验 2-2】将表 2-1(sy2_2.xls) 中的数据直接输入建立数据集 sy2_2,并将其存入逻辑库 mylib 中。
表 2-1职工工资
编号姓名性别工作日期职称部门基本工资工龄工资奖金扣款实发工资3003王以平男1992-8-1助工生产62030050001420
1
3004 林红女1993-8-1 助工供销620 280 500 200 1200
3005 吕兴良男1982-1-30 工程师技术1100 500 500 100 2000
3006 司马宇男1971-2-17 工人生产520 720 500 0 1740
3007 张学武男1967-10-9 工人保卫520 800 500 200 1620
3008 冯玉霞女1987-8-1 工程师生产1100 400 500 250 1750
3009 赵大强男1968-5-10 工人财务520 780 500 0 1800
3010 王萍女1987-8-1 工程师技术1100 400 500 100 1900
代码如下:
data mylib.sy2_2;
length gzrq $ 10;
input bh $ xm $ xb $ gzrq $ zc $ bm $ jbgz glgz jj kk sfgz;
label bh=' 编号 ' xm=' 姓名 ' xb=' 性别 ' gzrq=' 工作日期 ' zc=' 职称 ' bm=' 部门 '
jbgz=' 基本工资 ' glgz=' 工龄工资 ' jj=' 奖金 ' kk=' 扣款 ' sfgz=' 实发工资 ';
cards;
3003 王以平男 1992-8-1 助工生产620 300 500 0 1420
3004 林红女 1993-8-1 助工供销620 280 500 200 1200
3005 吕兴良男 1982-1-30 工程师技术1100 500 500 100 2000
3006 司马宇男 1971-2-17 工人生产520 720 500 0 1740
3007 张学武男 1967-10-9 工人保卫520 800 500 200 1620
3008 冯玉霞女 1987-8-1 工程师生产1100 400 500 250 1750
3009 赵大强男 1968-5-10 工人财务520 780 500 0 1800
3010 王萍女 1987-8-1 工程师技术1100 400 500 100 1900
;
RUN;
运行完成后,在逻辑库mylib 中双击数据集名sy2_2,可以查看结果如图2-1 所示:
图2-1 数据集 mylib.sy2_2
说明:
(1) SAS变量的基本类型有两种:数值型和字符型。数值型变量在数据集中的存贮一般
使用 8 个字节。 SAS 的字符型变量缺省的长度是8 个英文字符,可以使用LENGTH语句指定变量长度,LENGTH语句一般应出现在定义变量的Input 语句之前,格式为:LENGTH 字符型变量名$长度;
如:
LENGTH gzrq $ 10;
(2)语句:
2
label bh = '编号 ' xm = '姓名 ' xb = '性别 ' gzrq = ' 工作日期 ' zc = ' 职称 ' bm = '部门 ' jbgz = ' 基本工资 ' glgz = ' 工龄工资 ' jj = '奖金 ' kk = '扣款 ' sfgz = ' 实发工资 ';
为每个变量加标签。
(3)数据块中数据之间可以用空格隔开,也可以使用Tab 键。
3.读取外部数据文件建立数据集
【实验 2-3】读取文本文件sy2_3.txt (图 2-2)建立数据集work.sy2_3 。假设文本文件存
放在文件夹“原始数据”中。
图2-2 文本文件 sy2_3.txt
代码如下:
data sy2_3;
infile原始数据 \sy2_3.txt';
input bh$ xm $ xb$@@;
length gzrq$ 10;
input gzrq$ zc $ bm $ jbgz glgz jj kk sfgz;
run;
注意:文本文件中数据之间用空格隔开,不能使用Tab 键。
运行完成后,在临时库work 中双击数据集名 sy2_3 ,可以查看结果如图2-3 所示:
图 2-3数据集sy2_3
【实验 2-4】读取 Excel 文件 sy2_2.xls(如表 2-1 所示)建立数据集work.sy2_4 。已知 Excel 文件 sy2_2.xls 存放在文件夹“原始数据”中。
首先将表2-1 修改为如图2-4 所示的 Excel 表 sy2_4.xls, 并存放在原始数据中。
3
图2-4 Excel 表 sy2_4.xls
建立数据集work.sy2_4 代码如下:
proc import out=sy2_4
datafile =原始数据\sy2_4.xls"
dbms = excel2000 replace;
getnames = no;/*如果表中第一行为变量名,则删去此行*/
run;
注意: sy2_4.xls 中第 3 至 5 列中的多加的“0”是为了保证导入后字符型变量的长度正确。
二、数据文件的编辑与整理
1.数据集的复制与修改
【实验 2-5】将 mylib.sy2_2 中的“工作日期”去掉,基本工资小于600 的改为 600,生成新的数据集work.sy2_5 。
代码如下:
data sy2_5;
set mylib.sy2_2;
drop gzrq;
if jbgz< 600 then jbgz= 600;
run;
2.增加新变量
【实验 2-6】在 mylib.sy2_2 中增加变量 yfgz(应发工资 =基本工资 +工龄工资 +奖金)、生成新的数据集 work.sy2_6 。
代码如下:
data sy2_6;
set mylib.sy2_2;
yfgz = jbgz + glgz + jj;
run;
3.数据集的纵向拆分
【实验 2-7】按基本工资是否大于600 将 mylib.sy2_2 拆分成两个新数据集work.sy2_7_1 和work.sy2_7_2 。
代码如下:
data sy2_7_1 sy2_7_2;
4
set mylib.sy2_2;
select;
when (jbgz<600) output sy2_7_1;
when (jbgz>=600) output sy2_7_2;
end;
run;
4.数据集的纵向合并
【实验 2-8】将上述拆分后的两个数据集纵向合并恢复原样,产生新的数据集work.sy2_8 。
代码如下:
data sy2_8;
set sy2_7_1 sy2_7_2;
run;
5.数据集的横向合并
【实验2-9】将 mylib.sy2_2 中职称为“工人”的观测拆分成一个仅含编号、姓名和基本
工资,一个仅含有编号和实发工资的两个新数据集work.sy2_9_1和work.sy2_9_2。然后将work.sy2_9_1 和 work.sy2_9_2 合并成一个新数据集sy2_9。
(1)提取职称为“工人”的观测:
data sy2_9_0;
set mylib.sy2_2;
if (zc = '工人 ');
run;
(2)建立两个数据集:
data sy2_9_1;
set sy2_9_0;
keep bh xm jbgz;
run;
data sy2_9_2;
set sy2_9_0;
keep bh sfgz;
run;
(3)横向合并:
data sy2_9;
merge sy2_9_1 sy2_9_2;
by bh;
run;
proc print; run;/* 列表显示数据集sy2_9*/
6.数据的排序
【实验 2-10】将 mylib.sy2_2 按 jbgz 升序、 sfgz 降序排序后生成新的数据集work.sy2_10 。
代码如下:
5
proc sort data=mylib.sy2_2 out = sy2_10;
by jbgz descending sfgz;
run;
proc print data= sy2_10; /* 列表显示数据集 sy2_10*/ run;
说明:在对两个数据集横向合并时,为了避免因两个数据集观测顺序不同造成混乱,一
般应将两个数据集分别按同一个变量( BY 变量)排序后再合并,如【实验 2-9】中的横向合并可写成:
Proc sort data = sy2_9_1;
by bh;
Proc sort data = sy2_9_2;
by bh;
run;
data sy2_9;
merge sy2_9_1 sy2_9_2;
by bh;
run;
proc print; run;
7.数据的列表显示
【实验 2-11】列出数据集mylib.sy2_2 中所有男性职工的编号、姓名、部门、基本工资。
代码如下:
Proc print data= mylib.sy2_2 label;
var bh xm bm jbgz;
label bh = ' 编号 ' xm = '姓名 ' bm = '部门 ' jigz = '基本工资 '; where xb
= '男 ';
run;
2.4 上机演练
【练习 2-1】表 2-2( lx2_1.xls )为某邮购服务部的部分顾客记录,编程进行如下操作:
表 2-2 邮购服务部部分顾客记录
姓名性别地区日期金额
章文男华东1996-3-20 1099
王国铭男华东1996-5-19 39
童子敏女华北1996-1-5 986
刘念新男东北1997-10-1 3581
李思今女华北1997-4-4 659
关昭女东北1996-11-5 358
赵霞女东北1998-9-6 2010
6
SAS 软件与统计应用实验
(1)建立自己的逻辑库 (以自己名字的拼音命名 );
(2)用数据步把此数据输入到SAS 数据集并存放在自己的逻辑库中;
(3)列表显示男性顾客购买金额超过1000 的那些人;
(4)按金额降序排序并输出结果;
(5)把数据拆分为包含姓名、性别、地区的一个数据集和包含姓名、日期、金额的一个
数据集;
(6)用 MERGE 和 BY 合并上一步拆开的两个数据集。
【练习 2-2 】 SASHELP.PRDSALE是某国际公司在各地销售记录。变量ACTUAL是实际销售额, PREDICT 是预测的销售额, COUNTRY 是卖往的国家, REGION 是地区, DIVISION 是卖往的部门, PRODTYPE 是产品类型, PRODUCT 是具体的产品名称, QUARTER ,YEAR , MONTH 是销售时间的季度、年、月。编程进行如下操作:
(1)用 print 过程列出数据集中美国的销售记录,求给各列加上合理的中文标签;
(2)把数据集按产品类别、年、月排序后按产品类别分类列出年、月、实际销售额,不
显示观测序号。
2.5实验报告
请按练习内容写出包括如下内容的实验报告:
一、实验目的;
二、实验内容、程序及运行结果;
三、实验中存在的问题及解决方法;
四、实验体会(结论、评价、感想与建议等)。
7