1、SAS学习系列02 输出数据报表02. 输出数据报表利用SAS数据集,可以用PROC PRINT过程步根据需要输出各种满足一定条件的报表。一、 直接输出语法:proc print data = 数据集;run;注:此时(不加任何参数),默认(1) 输出数据集中的所有观测值和变量;(2) 报表最左侧增加一列观测值计数列“Obs列”;(3) 报表中变量出现的顺序与数据集中位置相同。(4)若要双倍行距输出报表,可以在数据集后面加上可选参数:“double”.例1 输出路径D:我的文档My SAS Files9.3下的SAS数据集therapy.代码:libname patients D:我的文档My
2、 SAS Files9.3;proc print data=patients.therapy; /* 注意数据集前加上 data = 否则报错 */run;运行结果(部分):二、 选择变量和输出顺序语法:proc print data = 数据集; var 变量1 变量2 ; run;注:(1)若不输出观测值计数列Obs,需加上参数noobs;(2)若要指定某列或某几列代替“Obs列”,可用id 变量1 变量2 注意:若一个变量既是var变量又是id变量,将输出两次。例2 (1) 输出原始数据集sasuser.admit (2)只输出变量age height weight fee代码:proc
3、 print data=sasuser.admit noobs;run;proc print data=sasuser.admit;var Age Height Weight Fee;id ID Name; run;运行结果(部分):三、 选择部分观测值语法:proc print data = 数据集;where 条件语句run;表示选择满足某条件的观测值。注意,where语句可以指定数据集中任何变量,而不受var语句的限制。条件语句可以由各种SAS算符和括号组合而成,为此下面介绍一点SAS中的比较、逻辑算符:符号含义示例= 或eq等于where name = Jones, C.;= 或ne不
4、等于where temp = 212; 或gt大于where income 20000; 或lt小于where partno = 或ge大于等于where id = 1543;= 或le小于等于where pulse = 85contains或 ?包含where firstname contains Jon;in属于where actlevel in (LOW,MOD);where fee in (124.80,178.20);and且where age75;or或where area=A or region=S;例3 输出数据集Sasuser.admit中满足条件Age30并且Height6
5、5的观测值,只输出变量Age Height Weight Fee.代码:proc print data=sasuser.admit;var Age Height Weight Fee;where Age30 and Height65;run;运行结果(部分):四、 对数据进行排序语法:proc sort data=数据集 out=新数据集;by 变量1 变量2 ;run;注:(1)省略“out=新数据集”,原数据集将被排好序的数据集替换;(2)“”为可选参数(递减排序),只对紧随其后变量起作用;默认是递增排序;(3)先按变量1排序,变量1相同,再按变量2排序(4)缺省值,当成最小的值。例4 对
6、数据集Sasuser.admit按照Weight递减,Age递增排序,将排序好的数据存为临时数据集work.wgtadmit. 并输出Age30的观测值,可选变量为Weight Age Height Fee.代码:proc sort data=Sasuser.admit out=work.wgtadmit;by descending Weight Age;run;proc print data=work.wgtadmit;var Weight Age Height Fee;where Age30;run; 运行结果(部分):五、 对数值变量生成按列汇总1. 语法: proc print dat
7、a = 数据集;sum 变量1 变量2 ;run;注:列的汇总,出现在最后一行,格式与变量列相同。例5 输出数据集Sasuser.insure中满足条件Pctinsured 80的观测值,对Balancedue列作汇总,只输出变量Name Policy Balancedue.代码:proc print data=Sasuser.insure;var Name Policy Balancedue;where Pctinsured 80;sum Balancedue;run;运行结果:2. 若要分组汇总,可以用by和sum组合来实现。语法: sum 变量1 变量2 ;by 变量1 ;注:(1)需要
8、对数据集进行“分组”处理时,可以用by语句,但要求数据集事先必须已经按by变量排好序了;(另一个“分组”处理语句是class,不要求数据集事先按class变量排序,按class变量的不同值进行分类计算和分析)(2)notsorted选项的作用就是告诉SAS:数据不是按照字母或者数字大小排序的,而是按照by变量的值按组排列的;(3)输出结果根据by变量不同的值,分成多个报表。例6 对数据集Sasuser.admit按Actlevel分组分别对各组的Fee进行汇总。代码:proc sort data=Sasuser.admit out=work.activity;by Actlevel;run;p
9、roc print data=work.activity;var Age Height Weight Fee;where Age40;sum Fee;by Actlevel;run;运行结果:若要以更紧凑直观的报表输出(用分组变量列代替Obs列),可以再加一个id语句,改写例6的代码如下:代码:proc sort data=Sasuser.admit out=work.activity;by Actlevel;run;proc print data=work.activity;var Age Height Weight Fee;where Age40;sum Fee;by Actlevel;i
10、d Actlevel;run;运行结果:若在每页输出一个报表,可以加上“pageby actlevel;”。六、 设置报表的标题和脚注语法: title 标题名;footnote 脚注名;注:(1)默认的标题是“SAS 系统”(居中),默认无脚注;(2)可选参数n,用来指定标题/脚注所在的行(title=title1);(3)title和footnote是全局命令,除非重新定义新的title和footnote或者结束当前SAS会话,否则将对后面的输出始终有效(取消前面的title,可以只用tilte关键词后面不加标题名)。例7 设置标题和脚注的例(无title2,会空出第2行).代码:titl
11、e1 Heart Rates for Patients with;title3 Increased Stress Tolerance Levels;footnote1 Data from Treadmill Tests;footnote3 1st Quarter Admissions;proc print data=Sasuser.stress;var resthr maxhr rechr;where tolerance=I;run;运行结果:七、 为变量指定描述性标签数据集的变量名可能是简写或略写,表义并不明确,可以用label命令重新指定变量标签。语法: proc print data=数
12、据集 label; label 变量1 = 变量标签1 变量2=变量标签2 ; run;注:数据集后面不要忘了加上label.例8 给变量设置描述性标签的例. 将变量名height设为Height in Inches, 将变量名weight设为Weight in Pounds.代码:proc print data=Sasuser.admit label;var actlevel height weight;label actlevel=Activity Levelheight=Height in Inches /* 也可以每个标签,都用label命令引出 */weight=Weight in
13、Pounds;run;运行结果(部分):八、 为输出变量指定格式1. 日期、数值等都有不同格式,可以根据需要指定。语法: proc print data=数据集;format 变量1 格式1 变量2 格式2;run;常用变量格式列表:格式语句含义示例w.整数值共占w位,无小数位5678w.d数值共占w位,d位小数5678.90$w.字符值共占w位,无小数位charDATE7.日期值共占7位,无小数位16OCT99 DATE9.日期值共占9位,无小数位16OCT1999MMDDYY 8.月日年共占8位,无小数位06/05/03MMDDYY10.月日年共占10位,无小数位09/12/1997COM
14、MAw.d逗号表示数值,共占w位,d位小数5,678.90DOLLAR w.d“美元号+数值”共占w位,d位小数$38,245.40注:(1)若指定的总位数w不够,SAS系统将自动按“最优选择”输出,例如,同样是“38245.3975美元”,DOLLAR12.2 输出 $38,245.40;DOLLAR9.2 输出 $38245.40DOLLAR8.2 输出 38245.40(2)SAS中的日期变量是按数值存储的,从01/01/1960开始计数,即0=01/01/1960, 1=01/02/1960.(3)在proc步中指定的label和format只是临时指定,只对当前程序步起作用。若要永久的指定label和format,可以在data步中使用label和forma命令;(4)也可以自己定义格式来使用,例如:proc format;value $repfmtTFB=BynumMDC=CrowleyWKK=King;run;proc print data=vcrsales;var salesrep type unitsold;format salesrep $repfmt.;run;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1