SAS学习系列02 输出数据报表.docx
《SAS学习系列02 输出数据报表.docx》由会员分享,可在线阅读,更多相关《SAS学习系列02 输出数据报表.docx(15页珍藏版)》请在冰豆网上搜索。
![SAS学习系列02 输出数据报表.docx](https://file1.bdocx.com/fileroot1/2023-7/26/8b56cc7d-c283-413e-802a-5db8f7ecb6aa/8b56cc7d-c283-413e-802a-5db8f7ecb6aa1.gif)
SAS学习系列02输出数据报表
02.输出数据报表
利用SAS数据集,可以用PROCPRINT过程步根据需要输出各种满足一定条件的报表。
一、直接输出
语法:
procprintdata=数据集;
run;
注:
此时(不加任何参数),默认
(1)输出数据集中的所有观测值和变量;
(2)报表最左侧增加一列观测值计数列“[Obs]列”;
(3)报表中变量出现的顺序与数据集中位置相同。
(4)若要双倍行距输出报表,可以在数据集后面加上可选参数:
“double”.
例1输出路径'D:
\我的文档\MySASFiles\9.3'下的SAS数据集therapy.
代码:
libnamepatients'D:
\我的文档\MySASFiles\9.3';
procprintdata=patients.therapy;/*注意数据集前加上data=否则报错*/
run;
运行结果(部分):
二、选择变量和输出顺序
语法:
procprintdata=数据集;
var变量1变量2…;
run;
注:
(1)若不输出观测值计数列[Obs],需加上参数noobs;
(2)若要指定某列或某几列代替“[Obs]列”,可用
id变量1变量2…
注意:
若一个变量既是var变量又是id变量,将输出两次。
例2
(1)输出原始数据集sasuser.admit
(2)只输出变量ageheightweightfee
代码:
procprintdata=sasuser.admitnoobs;
run;
procprintdata=sasuser.admit;
varAgeHeightWeightFee;
idIDName;
run;
运行结果(部分):
三、选择部分观测值
语法:
procprintdata=数据集;
where条件语句
run;
表示选择满足某条件的观测值。
注意,where语句可以指定数据集中任何变量,而不受var语句的限制。
条件语句可以由各种SAS算符和括号组合而成,为此下面介绍一点SAS中的比较、逻辑算符:
符号
含义
示例
=或eq
等于
wherename='Jones,C.';
^=或ne
不等于
wheretemp^=212;
>或gt
大于
whereincome>20000;
<或lt
小于
wherepartno<"BG05";
>=或ge
大于等于
whereid>='1543';
<=或le
小于等于
wherepulse<=85
contains或?
包含
wherefirstnamecontains'Jon';
in
属于
whereactlevelin('LOW','MOD');
wherefeein(124.80,178.20);
and
且
whereage<=55andpulse>75;
or
或
wherearea='A'orregion='S';
例3输出数据集Sasuser.admit中满足条件Age>30并且Height>65的观测值,只输出变量AgeHeightWeightFee.
代码:
procprintdata=sasuser.admit;
varAgeHeightWeightFee;
whereAge>30andHeight>65;
run;
运行结果(部分):
四、对数据进行排序
语法:
procsortdata=数据集out=新数据集;
by变量1变量2…;
run;
注:
(1)省略“out=新数据集”,原数据集将被排好序的数据集替换;
(2)“”为可选参数(递减排序),只对紧随其后变量起作用;默认是递增排序;
(3)先按变量1排序,变量1相同,再按变量2排序…
(4)缺省值,当成最小的值。
例4对数据集Sasuser.admit按照Weight递减,Age递增排序,将排序好的数据存为临时数据集work.wgtadmit.并输出Age>30的观测值,可选变量为WeightAgeHeightFee.
代码:
procsortdata=Sasuser.admitout=work.wgtadmit;
bydescendingWeightAge;
run;
procprintdata=work.wgtadmit;
varWeightAgeHeightFee;
whereAge>30;
run;
运行结果(部分):
五、对数值变量生成按列汇总
1.语法:
procprintdata=数据集;
sum变量1变量2…;
run;
注:
列的汇总,出现在最后一行,格式与变量列相同。
例5输出数据集Sasuser.insure中满足条件Pctinsured<80的观测值,对Balancedue列作汇总,只输出变量NamePolicyBalancedue.
代码:
procprintdata=Sasuser.insure;
varNamePolicyBalancedue;
wherePctinsured<80;
sumBalancedue;
run;
运行结果:
2.若要分组汇总,可以用by和sum组合来实现。
语法:
sum变量1变量2…;
by变量1…;
注:
(1)需要对数据集进行“分组”处理时,可以用by语句,但要求数据集事先必须已经按by变量排好序了;(另一个“分组”处理语句是class,不要求数据集事先按class变量排序,按class变量的不同值进行分类计算和分析)
(2)notsorted选项的作用就是告诉SAS:
数据不是按照字母或者数字大小排序的,而是按照by变量的值按组排列的;
(3)输出结果根据by变量不同的值,分成多个报表。
例6对数据集Sasuser.admit按Actlevel分组分别对各组的Fee进行汇总。
代码:
procsortdata=Sasuser.admitout=work.activity;
byActlevel;
run;
procprintdata=work.activity;
varAgeHeightWeightFee;
whereAge>40;
sumFee;
byActlevel;
run;
运行结果:
若要以更紧凑直观的报表输出(用分组变量列代替[Obs]列),可以再加一个id语句,改写例6的代码如下:
代码:
procsortdata=Sasuser.admitout=work.activity;
byActlevel;
run;
procprintdata=work.activity;
varAgeHeightWeightFee;
whereAge>40;
sumFee;
byActlevel;
idActlevel;
run;
运行结果:
若在每页输出一个报表,可以加上“pagebyactlevel;”。
六、设置报表的标题和脚注
语法:
title‘标题名’;
footnote'脚注名';
注:
(1)默认的标题是“SAS系统”(居中),默认无脚注;
(2)可选参数n,用来指定标题/脚注所在的行(title=title1);
(3)title和footnote是全局命令,除非重新定义新的title和footnote或者结束当前SAS会话,否则将对后面的输出始终有效(取消前面的title,可以只用tilte关键词后面不加标题名)。
例7设置标题和脚注的例(无title2,会空出第2行).
代码:
title1'HeartRatesforPatientswith';
title3'IncreasedStressToleranceLevels';
footnote1'DatafromTreadmillTests';
footnote3'1stQuarterAdmissions';
procprintdata=Sasuser.stress;
varresthrmaxhrrechr;
wheretolerance='I';
run;
运行结果:
七、为变量指定描述性标签
数据集的变量名可能是简写或略写,表义并不明确,可以用label命令重新指定变量标签。
语法:
procprintdata=数据集label;
label变量1=‘变量标签1’变量2=‘变量标签2’…;
run;
注:
数据集后面不要忘了加上label.
例8给变量设置描述性标签的例.将变量名height设为HeightinInches,将变量名weight设为WeightinPounds.
代码:
procprintdata=Sasuser.admitlabel;
varactlevelheightweight;
labelactlevel='ActivityLevel'
height='HeightinInches'/*也可以每个标签,都用label命令引出*/
weight='WeightinPounds';
run;
运行结果(部分):
八、为输出变量指定格式
1.日期、数值等都有不同格式,可以根据需要指定。
语法:
procprintdata=数据集;
format变量1格式1变量2格式2…;
run;
常用变量格式列表:
格式语句
含义
示例
w.
整数值共占w位,无小数位
5678
w.d
数值共占w位,d位小数
5678.90
$w.
字符值共占w位,无小数位
char
DATE7.
日期值共占7位,无小数位
16OCT99
DATE9.
日期值共占9位,无小数位
16OCT1999
MMDDYY8.
月日年共占8位,无小数位
06/05/03
MMDDYY10.
月日年共占10位,无小数位
09/12/1997
COMMAw.d
逗号表示数值,共占w位,d位小数
5,678.90
DOLLARw.d
“美元号+数值”共占w位,d位小数
$38,245.40
注:
(1)若指定的总位数w不够,SAS系统将自动按“最优选择”输出,例如,同样是“38245.3975美元”,
DOLLAR12.2输出$38,245.40;
DOLLAR9.2输出$38245.40
DOLLAR8.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)也可以自己定义格式来使用,例如:
procformat;
value$repfmt
'TFB'='Bynum'
'MDC'='Crowley'
'WKK'='King';
run;
procprintdata=vcrsales;
varsalesreptypeunitsold;
formatsalesrep$repfmt.;
run;