实验2SAS编程基础SAS语言和其它计算机语言一样,也有其专有的词汇(即关键字)和语法。关键字、名字、特殊字符和运算符等按照语法规则排列组成SAS语句,一个SAS程序由若干数据步、过程步组合而成,而每一个程序步通常由若干语句构成。SAS程序是在Editor窗口中进行编辑,提交运行后可以在Log窗口中显示有关信息和提示,在Output窗口显示运行的结果。2.1实验目的通过实验了解SAS编程的基本概念,掌握SAS编程的基本方法,掌握SAS数据步对数据集的管理和对数据的预处理。2.2实验内容一、建立逻辑库与数据集,包括逻辑库的建立、直接输入数据建立数据集与读取外部数据文件建立数据集。二、数据文件的编辑与整理,包括数据集的横向合并与纵向合并、数据集内容的复制、变量的增加与筛选、数据集的拆分和数据的排序。2.3实验指导一,建立逻辑库与数据集1.建立逻辑库【实验2-1】编程建立逻辑库。(I)首先在D盘创建一个文件夹,如D:ISASLXYISAS数据集。(2)建立逻辑库mylib,编辑并运行下面程序语句即可。libnamemylib"D:Isas_Ixylsas数据集";2.直接输入数据建立数据集【实验2-2】将表2-1(sy2_2.xls)中的数据直接输入建立数据集sy2_2,并将其存入逻辑库mylib 中。表2-1职工工资编号姓名性别工作日期职称部门基本工资奖金扣款实发工资工龄工资200162030050001420王新宇男1992-8-1助工生产2002供销6202805002001200张晓红女1993-8-1助工2003吕震云男工程师技术110050050010020001982-1-3013
13 实验 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_LXY\SAS 数据集。 (2) 建立逻辑库 mylib,编辑并运行下面程序语句即可。 libname mylib "D:\sas_lxy\sas 数据集"; 2. 直接输入数据建立数据集 【实验 2-2】将表 2-1(sy2_2.xls)中的数据直接输入建立数据集 sy2_2,并将其存入逻辑库 mylib 中。 表 2-1 职工工资 编号 姓名 性别 工作日期 职称 部门 基本工资 工龄工资 奖金 扣款 实发工资 2001 王新宇 男 1992-8-1 助工 生产 620 300 500 0 1420 2002 张晓红 女 1993-8-1 助工 供销 620 280 500 200 1200 2003 吕震云 男 1982-1-30 工程师 技术 1100 500 500 100 2000
生产52072050017402004李玉宇男1971-2-17工人02005毛学武男1967-10-9工人保卫5208005002001620李玉霞女1987-8-1工程师生产110040050025020061750男工人02007赵大伟1968-5-10财务5207805001800王平女2008工程师技术11004005001001987-8-11900李威男工人生产20091987-8-25203505001001270马艳丽女1987-8-3工程师技术110052050015019702010代码如下:data mylib.sy2_2;length gzrq $ 10;inputbhsxmsxb$gzrqszc$bm$jbgzjikkglgzsfgz,labelbh=编号xm=姓名xb=性别gzrq=工作日期ZC=职称bm=部门jbgz=基本工资glgz=工龄工资j=奖金'kk=扣款sfgz=实发工资cards;生产6202001王新宇男1992-8-1助工300500014202802002张晓红女1993-8-1助工供销6205002001200技术11002003吕震云男1982-1-30工程师5005001002000生产52072017402004李玉宇男1971-2-17工人50002005毛学武男1967-10-9工人保卫5208005002001620生产1100女1987-8-1工程师40050025017502006李玉霞工人财务52078050002007赵大伟男1968-5-1018002008王平女1987-8-1工程师技术11004005001001900男1987-8-2工人生产5203502009李威50010012702010马艳丽1987-8-3工程师技术11005205001501970;女RUN;运行完成后,在逻辑库mylib中双击数据集名sy22,可以查看结果如图2-1所示:O0VIEWTABLEMylib.Sy2.2性别朗门基本工设工龄工烫安全款工作日期编号姓名实发工国##公公品#公司男女男男男女见女用文虹聘公理#8###公#务店#的团nno究1992-8-1海利#有装有装有司护制林护腿护脚蛛护淋0的#一国的·m##1993-8-11902-1-301971-2-1T保196T-10-91897-6-1营曹公售19685-101987-6-1图2-1数据集mylib.sy2_2说明:(1)SAS变量的基本类型有两种:数值型和字符型。数值型变量在数据集中的存贮一般使用8个字节。SAS的字符型变量缺省的长度是8个英文字符,可以使用LENGTH语句指定变量长度,LENGTH语句一般应出现在定义变量的Input语句之前,格式为:LENGTH字符型变量名S长度;如:LENGTH gzrq $ 10;14
14 2004 李玉宇 男 1971-2-17 工人 生产 520 720 500 0 1740 2005 毛学武 男 1967-10-9 工人 保卫 520 800 500 200 1620 2006 李玉霞 女 1987-8-1 工程师 生产 1100 400 500 250 1750 2007 赵大伟 男 1968-5-10 工人 财务 520 780 500 0 1800 2008 王平 女 1987-8-1 工程师 技术 1100 400 500 100 1900 2009 李威 男 1987-8-2 工人 生产 520 350 500 100 1270 2010 马艳丽 女 1987-8-3 工程师 技术 1100 520 500 150 1970 代码如下: 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; 2001 王新宇 男 1992-8-1 助工 生产 620 300 500 0 1420 2002 张晓红 女 1993-8-1 助工 供销 620 280 500 200 1200 2003 吕震云 男 1982-1-30 工程师 技术 1100 500 500 100 2000 2004 李玉宇 男 1971-2-17 工人 生产 520 720 500 0 1740 2005 毛学武 男 1967-10-9 工人 保卫 520 800 500 200 1620 2006 李玉霞 女 1987-8-1 工程师 生产 1100 400 500 250 1750 2007 赵大伟 男 1968-5-10 工人 财务 520 780 500 0 1800 2008 王平 女 1987-8-1 工程师 技术 1100 400 500 100 1900 2009 李威 男 1987-8-2 工人 生产 520 350 500 100 1270 2010 马艳丽 女 1987-8-3 工程师 技术 1100 520 500 150 1970; RUN; 运行完成后,在逻辑库 mylib 中双击数据集名 sy2_2,可以查看结果如图 2-1 所示: 图2-1 数据集mylib.sy2_2 说明: (1) SAS 变量的基本类型有两种:数值型和字符型。数值型变量在数据集中的存贮一般使 用 8 个字节。SAS 的字符型变量缺省的长度是 8 个英文字符,可以使用 LENGTH 语句指定 变量长度,LENGTH 语句一般应出现在定义变量的 Input 语句之前,格式为: LENGTH 字符型变量名 $ 长度; 如: LENGTH gzrq $ 10;
(2)语句:labelbh="编号xm=姓名’xb=“性别gzrq="工作日期”zc="职称bm=‘部门jbgz="基本工资'glgz=工龄工资jj="奖金”kk="扣款sfgz="实发工资;为每个变量加标签。(3)数据块中数据之间可以用空格隔开,也可以使用Tab键。3.读取外部数据文件建立数据集【实验2-3】读取文本文件sy23.txt(图2-2)建立数据集work.sy23。假设文本文件存放在文件夹“D:ISASLXYI原始数据”中。ay23.tt-记事木B口区文件(E)编辑()格式(Q)香助(H)美市3003丢以平男1992-8-1財王620300500014203004麻红女男男男1993-8-1620280500200120088兰281982-1-30#程师林护红护脚材5001002000A1971-2-17人人017403007学800500200张1967-10-9A16203008美安男1100400250冯玉1987-8-1美师500175030091968-5-10520780500018004003010王萍1987-8-1工程师技术11005001001900图2-22文本文件sy23.txt代码如下:data sy2_3;infile'd:Isas_Ixy\原始数据sy2_3.txt"inputbhsxmsxb$@@:lengthgzrq$10,inputgzrq$zcsbmsjbgzglgzjikksfgzrun,注意:文本文件中数据之间用空格隔开,不能使用Tab键。运行完成后,在临时库work中双击数据集名sy23,可以查看结果如图2-3所示:COXVIRWTABLE:.bhJ68z818zaS18gzrq1车助工生产1992B-162050001420助工供销500女1993-8-12001200##男男男#N昌兴良工程师技术1100500100副马宇生产7201971-2软欢o520-张学蓝设1967-10-9B0O500200300B玛王路女明工程师50019878-1110063009赵大强财务180019685-10工人520780500019003010工程师1100400500王萍文1987B-1技术100R-山山图2-3数据集sy2_3【实验2-4】读取Excel文件sy22.xls(如表2-1所示)建立数据集work.sy24。已知Excel文件sy22.xls存放在文件夹“d:Isasshiyanl原始数据”中。首先将表2-1修改为如图2-4所示的Excel表sy2_4.xls,并存放在d:lsas_shiyanl原始数据中。15
15 (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。假设文本文件存放 在文件夹“D:\SAS_LXY\原始数据”中。 图2-2 文本文件sy2_3.txt 代码如下: data sy2_3; infile 'd:\sas_lxy\原始数据\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 存放在文件夹“d:\sas_shiyan\原始数据”中。 首先将表 2-1 修改为如图 2-4 所示的 Excel 表 sy2_4.xls,并存放在 d:\sas_shiyan\原始数据 中
0CRFGHAB王以半000男0工0000生产003003001420300363001200红助工供销6202803004女1200203005B兴R男工程婚热术1100500100200035003006可马丰工人生产5201740张学试男保卫500800R2003007工人16205高玉菱S030084工程师生产110040023017.506工人3009起大强男财务52078001800783010王津女工程婚热术11004005001001900图2-44Excel表sy2_4.xls建立数据集work.sy2_4代码如下:proc import out=sy2_4datafile="d:sas_shiyanV原始数据\sy2_4.xls"dbms=excel2000 replace,getnames = no;/*如果表中第一行为变量名,则删去此行*/run;注意:Sy2_4.xls中第3至5列中的多加的“0”是为了保证导入后字符型变量的长度正确。二、数据文件的编辑与整理1.数据集的复制与修改【实验2-5】将mylib.sy2_2中的“工作日期”去掉,基本工资小于600的改为600,生成新的数据集work.sy25。代码如下:data sy2_5;set mylib.sy2_2,drop gzrq;if jbgz<600then jbgz=600,run;2.增加新变量【实验2-6】在mylib.sy2_2中增加变量yfgz(应发工资=基本工资+工龄工资+奖金)、生成新的数据集work.sy26。代码如下:data sy2 6:set mylib.sy2_2,yfgz=jbgz+glgz+j;run,3.数据集的纵向拆分【实验2-7】按基本工资是否大于600将mylib.sy22拆分成两个新数据集work.sy2_7_1和work.sy2_7_2。代码如下:datasy2_7_1 sy2_7_2;set mylib.sy2_2,16
16 图2-4 Excel表sy2_4.xls 建立数据集 work.sy2_4 代码如下: proc import out=sy2_4 datafile = "d:\sas_shiyan\原始数据\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; set mylib.sy2_2;
select,when (jbgz<600)outputsy27_1when (jbgz>=600)outputsy2_7_2;end;run;4.数据集的纵向合并【实验2-8】将上述拆分后的两个数据集纵向合并恢复原样,产生新的数据集work.sy2_8。代码如下:datasy2_8;set sy2_7_1 sy2_7_2;run;5.数据集的横向合并【实验2-9】将mylib.sy22中职称为“工人”的观测拆分成一个仅含编号、姓名和基本工资,一个仅含有编号和实发工资的两个新数据集work.sy291和work.sy292。然后将work.sy2_91和work.sy2_9_2合并成一个新数据集sy29。(1)提取职称为“工人”的观测:datasy2_9_0;set mylib.sy2_2,if(zc=工人);run;(2)建立两个数据集:datasy2_9_1;set sy2_9_0;keepbhxmjbgz,run,datasy2_9_2;set sy2_9_0,keepbhsfgz,run;(3)横向合并:datasy2_9;merge sy2_9_1 sy2_9_2;by bh,run;procprint;run;/*列表显示数据集sy2_9*/6.数据的排序【实验2-10】将mylib.sy2_2按jbgz升序、sfgz降序排序后生成新的数据集work.sy2_10。代码如下:proc sort data=mylib.sy2_22out=sy2_10;17
17 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。 代码如下: proc sort data= mylib.sy2_2 out = sy2_10;