sas基本统计笔记

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Range极差 mean(1,2,3)平均 std 标准差
/**自动导入**/
Libname cwb “”;
proc import
datafile="E:\WORK\杂七杂八\SAS数据库\分期乐入池数据\明细数据(风险指标监控表&实际还款表)\荷包一期_风险指标监控表详细总表&today_date..xls"
out=work.risk001
dbms=excel replace;
sheet='风险指标监控表总表';
getnames=yes; 导入源文件字段名作为SAS数据集的字段名
自动导入
%macro chouc(today_date);
datafile="C:\Users\抽查\一债权基础池报表&today_date..xls"
out=work.chouc01
dbms=excel replace;
sheet="债权基础池";
run;
%mend;
%chouc(20170116);
导出:
/4*先排序*/
proc sort data=new_cy2;
by _COL1 ;
run;
/***标题**打印*/
proc print ;
title'员工薪水';
RUN;
proc print data=cwb.result20170208 label;
id package;
var overdue_principal_za overdue_principal_fql;
label overdue_principal_za="违法停车" overdue_principal_fql="林肯" ;
run;
proc print data=cwb.result20170208;
where principal_sell > 20000000;
run;
/*统计表格*/
1\
proc tabulate data=work.risk005b;
class _COL22; 分类变量
var _COL5;分析变量
table _COL22 _COL5;列维说明/选项(math chinese)*(mean var)反映男女生数学语文成绩的平均值方差
run;
2\
proc tabulate data=work.risk005b;
class _COL22;
var _COL5 _COL4;
table _COL22, (_COL4 _COL5)*(mean max min);
run;
table _COL22 all, (_COL4 _COL5)*(mean max min); 加个ALL,有求和,图2.
也可写为例如table (_COL22 all)*(_COL4)*(mean);如图
也可加标签 table (sex all), (math chinese)*(mean std);
keylabel mean='平均值' std='标准差' all='总计';
label sex='性别' math='数学' chinese='语文';
run;
/**复制*强制追加*把B加到A中*而SET是要新建一个的*/
proc append base=chouc.chouc01 data=chouc.chouc02 force;/**force强制*/
run;
/**复制*强制追加*把B加到A中*而SET是要新建一个的*/
proc sort data=chouc.chouc01 dupout=chouc.bb noduprecs;/**noduprecs一行完全相同的重复记录*/
by descending _COL0 ;
run;
/**sql*联合查询**/
Proc sql;
Select * from a
Union /*多个查询结果合并成一个结果,并去掉重复** /
Intersect /*查询公共部分数据*/
Except /*把公共部分去掉的数据*/
Outer union /*对多个查询结果横向合并*/
Select * from b;
Quit;
/**去**重复**方法之一***/
只显示name
select name from tb group by name having count(*) > 1
显示所有数据
select * from name in (select name from tb group by name having count(*) > 1)
*2、输出重复的观测值,使用nodupkey选项,注意:使用该选项后直接将原数据集中的重复值删除。

注意dupout和out的区别;
proc sort data=clasdata dupout=dups3 nodupkey;
??by name class;
run;
*输出不重复的观测值。

;
proc sort data=clasdata out=nodups4 nodupkey;
??by name class;
run;
*3、去掉重复的观测值使用nodup选项。

;
proc sort data =Clasdata out =NODUPS5 nodup;
? ? by??name class;
run ;/****删除***2017年1月3日的数据**/
data cwb.result;
set cwb.result;
if account_time="03jan2017"d then delete;
run;
SQL 去重复:
SELECT DISTINCT "栏位名"
?FROM "表格名"
举例来说,若要在以下的表格,Store_Information,找出所有不同的店名时,Store_Information表格
SELECT DISTINCT store_name FROM Store_Information
结果:
1
2
3
/*频率*****一般用这个*******************************************/
proc freq data = asd;
tables …..变量
run;
/**描述统计***例如*/
proc summary data=work.risk004 mean max min cv var;
class _COL4;
var _COL4;
output out=aa mean=a max=b min=c cv=d var=e;
run;
proc print data=work.aa;
run;
/*分类****频次************************************************/
proc means data=cwb.Overdue20170102;
var veight;/**变量占比,即在总体中的相对重要程度**/
freq _COL4;/**按照_COL4求观测值频度**/
class _COL222;/**按_COL22分类**/
run;
/*MEANS、SUMMARY*功能之外*还可以如例绘制PLOTS茎叶图、盒形图、正态概率图/NORMAL 正态分布**/
proc univariate data=work.aa plots ;
var _col4;
run;
/**取第2行到第10行的数据**/
Data aa;
Set aaa (firstobs=2 obs=10)
/**取前2行数据**/
Data aa;
Set aaa (obs=2);
Run;
/1*筛选例***********************************************************/ data a(where=(_COL10>1500));
set cy;
where _COL21>18 and _COL18>1500;
where _COL29="上班人群";
run;
/2*有7000个人,随机抽样25个********************************************/ PROC SURVEYSELECT
DATA = a
out = new_cy2
method = srs/**固定格式*/
n =25
seed = 7000;
RUN;
/**读取***几条记录***/
PROC SQL NUMBER OUTOBS=3;
SELECT * FROM WORK.A;
QUIT;
/3*有1000个人,按性别(sex)分为两层,每层按0.1的比例抽样*******************/ proc surveyselect
data=c
out=d
method=srs
samprate=0,1
seed=25070419;
strata sex;
run;
proc print data=d;
run;
/**分层抽取***/
proc surveyselect /**随机**/
data = Work.chouc01
out = chouc.chouc01
method = srs
sampsize = (5, 5,15 )/**抽取数据量*顺序与分层例相同*/
noprint;
strata _col22; /**分层**/
run;
/********求平均值********************/
proc sql;
select _COL3,mean(loan_amt,repay_amount)from fql;
quit;
/** N,10分位等
proc means data=wj.yrs_201612 N P1p10p25p50p75p90p99min max mean sum maxdec=2;/***规定最多输出2位小数**/
vars crlim epp_amt R_prin eve_prin age FEE_RATE epp_num R_num;
run;
/**更新**已知数据集A和B,用A做为主数据集,生成新数据AB**/
data ab;
update a b;
by id;/**根据卡号更新数据*/
run;
/******模型****reg回归分析*****/
proc reg data=cwb.Overdue20170102;
model _COL21= _COL22;
run; 统计关键字
((((( 1. means过程的一般格式
proc means?选项列表;
by?变量名称(分组变量);
class?变量名称(分组变量);
freq变量名称(数值变量,用以表示相应记录出现的频数)
weight变量名称(数值变量,用以表示相应记录的权重系数)
var?变量名称(待分析的数值变量);
run;
univariate过程的一般格式
proc univariate?选项列表;
by?变量名称(分组变量);
class?变量名称(分组变量);
freq变量名称(数值变量,用以表示相应记录出现的频数)
weight变量名称(数值变量,用以表示相应记录的权重系数,占比,)histogram?变量名称/选项列表
output <out=数据集名> <统计量关键字=自定义变量名> ??pctlpts=<百分位数…>??<指定需要的百分位数>
??pctlpre=<新变量名列>??<指定所需百分位数对应的输出变量名> var?变量名称(待分析的数值变量);
run;
SAS中可以计算的描述性统计量关键字及其含义
关键字所代表的含义
n有效数据记录数
nmiss缺失数据记录数
mean均数
std标准差
stderr标准误
var方差
median中位数
mode众数
cv变异系数
max最大值
min最小值
range全距
sum总计
sumwgt加权值总计
css校正的离均差平方和
uss未校正的离均差平方和
clm可信限(上下界值)
lclm可信限下侧界值
uclm可信限上侧界值
skew(skewness)偏度
kurt(kurtosis)峰度
t分布位置假设检验之t统计量probt上述t统计量对应的概率值
q1第一四分位数
q3第三四分位数
qrange四分位数间距
p1第一百分位数
p5第五百分位数
p10第十百分位数
p90第九十百分位数
p95第九十五百分位数
p99第九十九百分位数)))))))
/**把分析结果以PDF显示*/
ods pdf file="C:\Users\chengwubin\Desktop\_ppdf.pdf"; /*可以在指定路径或系统显示*/
proc means data=work.aa;
var _COL4 _COL5;
output out=work.bbbbb;
run;
proc print data=work.bbbbb;
run;
ods pdf close;
/**把分析结果以HTML显示*/
ODS HTML FILE="C:\Users\chengwubin\Desktop\FX.HTML"
CONTENTS="FXCON.HTML"/*固定格式*文件体存诸*/
FRAME="FXFR.HTML"/*固定格式*合并表内容*/
PAGE="FXPA.HTML";/*固定格式*指定分析存储到HTML*/
PROC MEANS DATA=WORK.AA;
VAR _COL4;
RUN;
ODS HTML CLOSE;
/*RTF格式,既word**/
ods listing close;/*关闭输出窗口*/
ods rtf file="C:\Users\chengwubin\Desktop\_ppdf.rtf";
proc means data=work.aa;
var _COL4 _COL5;
output out=work.bbbbb;
run;
proc print data=work.bbbbb;
run;
ods rtf close;
ods listing ;/*打开输出窗口*/
/**输出为DAT格式***/
filename wwb "C:\Users\chengwubin\Desktop";/*定义输出路径和文件名逻辑文件名**/
option nocenter;/*全局变量,显示不居中,靠左*/
ods listing file="C:\Users\chengwubin\Desktop\qa.dat";
proc print data=work.qa;/*SAS程序*/
run;
ods listing;/*打开OUTPUT窗口*/
/**输入为CSV格式,可用EXCEL打开**/
option nocenter;
filename exout "C:\Users\chengwubin\Desktop\work\fql抽查\cc1期.csv";
ods listing close;固定
ods results off; 固定
ods csvall file=exout; 固定
proc print data=chouc.chouc01;
run;
ods csvall close; 固定
ods results on; 固定
ods listing; 固定
/*GLMg一般线性模型*对3个学生分别测量在各年龄时的身高情况*相关性*/ data aa;
input id sex $ y1-y3;
y=y1; age=10;
y=y2; age=15;
y=y3; age=20;
cards;
1 f 120 130 160
2 m 130 150 170
3 f 110 135 159
;
run;
proc glm data=aa;
class sex;
model y1-y3=sex;
repeated age 3 (101520 );
run;
/*mixed模型为混合模型有与glm的功能也更强大*/
data ab;
input id sex $ y1-y3;
y=y1; age=10;
y=y2; age=15;
y=y3; age=20;
cards;
1 f 120 130 160
2 m 130 150 170
3 f 110 135 159
;
run;
proc mixed data=ab;
class sex age;
model y=sex age;
repeated;/*没有指定R,用的默认R距陈*/
run;
例:
/*散点图*连线图gplot/
proc gplot data=A;
symbol i=none v=star;
/*SYMBOL语句是一个全程语句,指定绘图用的连线方式、颜色、散点符号、大小,等等。

SYMBOL 语句可以带编号,如SYMBOL2,SYMBOL3*/
plot amount*_COL0;/*以SATV为纵轴、以SATM为横轴,用PLOT语句指定绘图用的变量*/
run;
/*绘制曲线*/
proc gplot data=sasuser.air;
symbol1i=join v=none line=1 ;/*第一个SYMBOL语句指定了LINE=1,表示线型为实线*/
symbol2i=join v=none line=2 ;/*第一个SYMBOL语句指定了LINE=2,表示线型为虚线*/
plot co*datetime=1 so2*datetime=2 / overlay;
/*我们在PLOT语句中用了“纵轴*横轴= n”的格式来指定曲线使用哪一个SYMBOL语句的规定来画, n对应于SYMBOL语句的序号*/
run;
/*SYMBOL语句的I=选项还可以取SPLINE表示在散点间连接连样条曲线,
A取I=SM nn( nn取00-99值)表示绘制样条曲线但可以不经过散点, nn值代表曲线光滑性与拟和度的折中。

B取I=NEEDLE绘制每个点到横轴的垂线。

C取I=RL 绘制线性回归直线,I=RQ为二次曲线,I=RC为三次曲线,
D后面加上CLI nn如RLCLI95表示在回归直线之外绘制预测值的95%置信限曲线*/
/*用GCHART过程绘制直方图、扇形图、三维直方图等表示变量分布的图形,*/
proc gchart data=fqll;
hbar _COL5;
run;
/*其中绘图用的变量用VBAR语句给出。

如果把VBAR改成HBAR则条形方向变为横向。

用GCHART绘制的直方图和在INSIGHT中绘制的直方图有所不同,它在横轴标的是区间的中点值,而在INSIGHT中横轴标的是区间的端点值。

可以绘制分组的直方图,例如按性别分组绘制两个直方图并排放置,可以用如下程序:*/
goptions ftext="宋体";
proc gchart data=fqll;
title"剩余期限频率图";
vbar _COL6 / group=_COL20;
label _COL6 = "剩余期限";
run;
/*在GCHART中用PIE语句绘制表示频数的扇形图,例如: */
proc gchart data=fqll;
pie _COL6 /TYPE=PERCENT;/*如果想显示百分比值,只要在PIE语句中加入
TYPE=PERCENT选项,*/
run;
用SAS/GRAPH绘图
SAS可以把存贮在SAS数据集中的数据以图形的方式形象直观地显示出来。

在SAS/GRAPH 模块的支持下,SAS可以作散点图、曲线图、直方图、扇面图、三维曲面图、等高线图、地图,等等。

散点图和曲线图
用GPLOT过程绘制散点图和曲线图。

比如,我们要绘制SASUSER.GPA中SATV对SASM的散点图,只要用此程序:
proc gplot data=sasuser.gpa;
symbol i=none v=star;
plot satv*satm;
run;
结果显示了一个GRAPHICS窗口,绘出了以SATV为纵轴、以SATM为横轴的散点图(见图 1)。

在GPLOT过程中,用PLOT语句指定绘图用的变量。

SYMBOL语句是一个全程语句,指定绘图用的连线方式、颜色、散点符号、大小,等等。

SYMBOL 语句可以带编号,如SYMBOL2,SYMBOL3 等,不带编号的相当于SYMBOL1。

为了绘制连线,只要在SYMBOL语句中指定I=JOIN。

比如,对SASUSER.AIR数据集,以DATETIME 为横轴、以CO为纵轴绘曲线图图,可以用:
proc gplot data=sasuser.air;
symbol i=join v=star;
plot co*datetime;
run;
见图 2。

如果不想在图中出现散点符号可以在SYMBOL语句中用V=NONE。

为了在图中作几条曲线,只要在PLOT语句中指定多个因变量(自变量一般应为同一个),并使用OVERLAY选项,如:
proc gplot data=sasuser.air;
symbol1 i=join v=none line=1 ;
symbol2 i=join v=none line=2 ;
plot co*datetime=1 so2*datetime=2 / overlay;
run;
其中我们指定了两个SYMBOL语句,第一个SYMBOL语句指定了LINE=1,表示线型为实线,第二个SYMBOL语句指定了LINE=2表示线型为虚线。

我们在PLOT语句中用了“纵轴*横轴= n”的格式来指定曲线使用哪一个SYMBOL语句的规定来画,n对应于SYMBOL语句的序号。

SYMBOL语句的I=选项还可以取SPLINE表示在散点间连接连样条曲线,取I=SM nn (nn取00-99值)表示绘制样条曲线但可以不经过散点,nn值代表曲线光滑性与拟和度的折中。

取I=NEEDLE绘制每个点到横轴的垂线。

取I=RL 绘制线性回归直线,I=RQ为二次曲线,I=RC为三次曲线,后面加上CLI nn如RLCLI95表示在回归直线之外绘制预测值的95%置信限曲线,比如:
proc gplot data=sasuser.gpa;
symbol i=rlcli95 v=star;
plot satv*satm;
run;
见图 3。

GPLOT过程还可以有其它灵活的用法,可以参考有关资料或用SAS系统菜单“Help | Extended Help”,从中找“SAS System Help: Main Menu | Graphics | GPLOT”。

直方图和扇形图
用GCHART过程绘制直方图、扇形图、三维直方图等表示变量分布的图形。

例如,要绘制SASUSER.GPA中GPA的分布直方图,只要用:
proc gchart data=sasuser.gpa;
vbar gpa;
run;
其中绘图用的变量用VBAR语句给出。

图形见图 4。

如果把VBAR改成HBAR则条形方向变为横向。

用GCHART绘制的直方图和在INSIGHT中绘制的直方图有所不同,它在横轴标的是区间的中点值,而在INSIGHT中横轴标的是区间的端点值。

可以绘制分组的直方图,例如按性别分组绘制两个直方图并排放置,可以用如下程序:
proc gchart data=sasuser.gpa;
vbar gpa / group=sex;
run;
结果见图 5。

在GCHART中用PIE语句绘制表示频数的扇形图,例如:
proc gchart data=sasuser.gpa;
pie sex;
run;
结果见图 6。

如果想显示百分比值,只要在PIE语句中加入TYPE=PERCENT选项,如“pie sex / type=percent;”。

GCHART过程还可以用BLOCK语句绘制三维直方图。

例如,在SASUSER.HOUSES有各种房子的情况,其中BEDROOMS表示卧室个数,STYLE表示房子的式样,都是分类变量,我们可以用如下程序画出反映卧室个数和房子式样的联合分布的三维直方图:
goptions hpos=90 vpos=70;
proc gchart data=sasuser.houses;
block style / group=bedrooms;
run;
三维曲面图和等高线图
假设对一个二元函数z=f(x,y),我们有了x取等间隔值、y取等间隔值时z的值,这时我们可以用G3D过程绘制曲面图形,用GCONTOUR绘制曲面的等高线图。

例如,我们想绘制一个二维正态分布曲面的图形,假设(X,Y)服从联合正态分布,其均值都是0,方差分别为1和a,相关系数为r。

这时,我们可以得到(X, Y)的联合密度函数的公式为:
我们可以在一个网格上计算曲面的值:
data dnorm2;
a=2;
a2=sqrt(a);
r=0.5;
det=a*(1-r*r);
do x=-3 to 3 by 0.3;
do y=-3*a2 to 3*a2 by 0.3*a2;
z=1/(2*3.1415926*det)*exp(-0.5/det*(a*x*x + y*y - 2*r*a2*x*y)); output;
end;
end;
keep x y z;
run;
然后,我们就可以用G3D过程来绘制曲面图:
proc g3d data=dnorm2;
plot x*y=z;
run;
见图 8。

用GCONTOUR过程可以绘制曲面对应的等高线图,例如:
proc gcontour data=dnorm2;
plot x*y=z;
run;
见图 9。

图形的调整与输出
各绘图过程中都指定了丰富的选项来调整图形,读者可以参考有关资料或查系统
的帮助。

另外,在图形中也可以用TITLE语句和FOOTNOTE语句给图形加标题和
脚注。

为了在图形的标题、标签中也能使用汉字,老的SAS版本需要比较多的步
骤,但是在Windows下的SAS 8.0以后只要很简单的语句就可以在图形中使用
True Type字型的汉字,例如:
goptions ftext="宋体";
proc gplot data=sasuser.class;
title "试验FONTS的汉字功能";
plot weight * height;
label weight = "体重" height="身高";
run;
见图 10。

??
SAS过程初步
(转载自SAS园地)
•SAS过程用法及常用语句
o SAS过程用法
o SAS过程步常用语句
•用PRINT过程制作列表报告
o基本用法
o使用中文列标题
o标题及全程语句
o用BY语句分组处理
o计算总计和小计
•用TABULATE过程作统计量表格
•用SORT过程排序
•MEANS过程、UNIVARIATE过程、FREQ过程
•用CORR过程计算相关系数
•用SAS/GRAPH绘图
o散点图和曲线图
o直方图和扇形图
o三维曲面图和等高线图
o图形的调整与输出
前面讲过,SAS系统用SAS数据步生成和管理数据,用过程步进行分析、报表、绘图。

本章介绍SAS 过程步的一般用法和常用语句的含义,以及几个简单报表、分析、绘图过程的使用。

SAS过程用法及常用语句
SAS过程用法
SAS过程步的一般形式为:
PROC 过程名 DATA=输入数据集选项;
过程语句 / 选项;
过程语句 / 选项;
……
RUN;
其中PROC语句的选项是可选的,用来规定过程运行的一些设置,如果有多个选项用空格分开。

DATA=输入数据集也是可选的,如果缺省的话使用最近生成的数据集。

过程步一般以RUN 语句结束,也可以省略RUN语句而在下一个过程步或数据步的开始处结束,另外还有一种所谓“交互式过程”可以在遇到RUN语句时不结束过程运行,只有遇到QUIT语句或者下一个过程步、数据步时才结束。

过程步在PROC语句之后、结束之前可以有若干个过程语句。

通常情况下,过程语句与数据步中的语句不同,数据步中的语句不能用在过程步中。

过程步语句一般以某一个关键字开头,比如VAR、BY、TABLES、WEIGHT等,语句中有一些有关说明,如果有选择项的话要写在斜杠后。

SAS过程步有些是对数据集作某种变换(比如SORT过程对数据集排序),不生成显示结果;多数过程步是对数据集作某些分析、报表,这时结果出现在OUTPUT窗口(高精度绘图过程的输出在GRAPHICS 窗口)。

对OUTPUT窗口的结果,我们可以用“File | Save As”菜单把它保存到一个文本文件进行进一步的修饰,插入到其它报告中,也可以用“File | Print ”菜单之间打印。

SAS过程步常用语句
本小节简单介绍几个在SAS过程步中常见的语句,更具体的用法可以在以后实际用到时再仔细体会。

一、VAR语句
VAR语句在很多过程中用来指定分析变量。

在VAR后面给出变量列表:
VAR 变量名1 变量名2 … 变量名n;
变量名列表可以使用省略的形式,如X1-X3,MATH--CHINESE等。

VAR用法例如:
var math chinese;
二、MODEL语句
MODEL语句在一些统计建模过程中用来指定模型的形式。

其一般形式为
MODEL 因变量=自变量表 / 选项;
比如
model math=chinese;
即用语文成绩预测数学成绩。

三、BY语句和CLASS语句
BY语句在过程中一般用来指定一个或几个分组变量,根据这些分组变量值把观测分组,然后对每一组观测分别进行本过程指定的分析。

在使用带有BY语句的过程步之前一般先用SORT过程对数据集排序。

比如,假设我们已经把C9501数据集按性别排序,则下列PRINT 过程可以把男、女生分别列出:
proc print data=c9501;
by sex;
run;
结果为
The SAS System 2
----------------------------------- SEX=男 -----------------------------------
OBS NAME MATH CHINESE
1 李明 9
2 98
2 王思明 86 90
3 张聪 98 109
----------------------------------- SEX=女 -----------------------------------
OBS NAME MATH CHINESE
4 张红艺 89 106
5 刘颍 80 110
在一些过程(如方差分析)中,使用CLASS语句指定一个或几个分类变量,它实际相当于因变量。

而在另一些过程(如MEANS)中,CLASS语句作用与BY语句类似,可以指定分类变量,把观测按分类变量分类后分别进行分析。

使用CLASS时不需要先按分类变量排序。

四、OUTPUT语句
在过程步中经常用OUTPUT语句指定输出结果存放的数据集。

不同过程中把输出结果存入数据集的方法各有不同,OUTPUT语句是用得最多的一种,其一般格式为:
OUTPUT OUT=输出数据集名关键字=变量名关键字=变量名…;
其中用OUT=给出了要生成的结果数据集的名字,用“关键字=变量名”的方式指定了输出哪些结果(关键字的例子比如MEANS过程中的MEAN,VAR,STD等等),等号后面的变量名指定了这些结果在输出数据集中叫什么名字。

例如
proc means data=sasuser.c9501;
var math;
output out=result n=n mean=meanmath var=varmath;
run;
proc print data=result; run;
五、FREQ语句和WEIGHT语句
FREQ语句指定一个重复数变量,每个观测中此变量的值说明这个观测实际代表多少个完全相同的重复观测。

FREQ变量只取整数值。


freq numcell;
WEIGHT语句指定一个权重变量,在某些允许加权的过程中代表权重,其值与观测对应的方差的倒数成比例。

六、ID语句
有些过程(如PRINT、UNIVARIATE)需要输出观测的代号,这一般使用观测的序号。

但是,如果数据集中有一个变量可以用来区分观测(如人名、省市名),就可以用ID语句指定这个变量作为观测标识,如:
id name;
指定用变量NAME的值来标识观测。

七、WHERE语句
用WHERE语句可以选择输入数据集的一个行子集来进行分析,在WHERE关键字后指定一个条件。

比如:
where math>=60 and chinese>=60;
指定只分析数学、语文成绩都及格的学生。

八、LABEL语句和FORMAT语句
LABEL语句为变量指定一个标签,很多过程可以使用这样的标签。

其格式为
LABEL 变量名='标签' 变量名='标签' …;
例如
proc print data=sasuser.c9501 label;
id name;
var math chinese;
label name='姓名' math='数学成绩' chinese='语文成绩';
run;
结果显示
姓名数学成绩语文成绩
李明 92 98
张红艺 89 106
王思明 86 90
张聪 98 109
刘颍 80 110
FORMAT语句可以为变量输出规定一个输出格式,比如
proc print data=sasuser.c9501; format math 5.1 chinese 5.1;
run;
使得列出的数学、语文成绩宽度占5位,带一位小数。

事实上,在生成数据集的DATA步中也可以用FORMAT语句规定变量的输出格式,用LABEL 语句规定变量的标签,用LENGTH语句规定变量的存贮长度,用ATTRIB语句同时规定变量的各属性。

在数据步中规定的变量属性是附属于数据集本身的,是永久的;在过程步中规定的变量属性(标签、输出格式等)只用于此过程的本次运行。

用PRINT过程制作列表报告
本节讲解PRINT过程的使用,并用它来辅助讲解一些常用语句的使用。

基本用法
PRINT过程是最常用的SAS过程之一。

我们在生成了一个数据集之后,如果不是太大,一般都用一个
proc print;run;
过程步来列出数据集的内容,这样可以检查变量与值之间对应是否正确,数据输入是否正确。

为了列出一个指定的数据集,在PROC语句中使用DATA=选项指定要列表的输入数据集名,比如:
proc print data=sasuser.gpa; run;
在过程内使用VAR语句可以指定要列出的变量并指定顺序。

比如,
proc print data=c9501;
var name chinese sex;
run;
列出变量NAME、CHINESE、SEX的值。

注意这已不是生成时的变量顺序。

变量MATH未列出。

结果如下
The SAS System 3
OBS NAME CHINESE SEX
1 李明 98 男
2 张红艺 106 女
3 王思明 90 男
4 张聪 109 男
5 刘颍 110 女
注意PRINT的输出第一列总是标为OBS,值为观测序号。

我们有时不想输出这一列,可以在PROC PRINT 语句中加入NOOBS选项,如:
proc print data=c9501 noobs;
run;
结果中就没有了OBS这一列。

在过程中使用WHERE语句可以从输入数据集中选一个子集来处理,在PRINT过程中使用WHERE 可以
指定只列出满足条件的观测。

比如,
proc print data=c9501;
where name in ('李明', '张聪');
run;
结果为
OBS NAME SEX MATH CHINESE AVG
1 李明男 9
2 98 86.8333
4 张聪男 98 109 94.4167
只列出了李明和张聪两个人的观测。

注意其观测序号分别为1和4,这是生成C9501数据集时确定的。

使用中文列标题
为了对列标题使用中文,可以在过程内用LABEL语句给变量指定标签,同时在PROC PRINT语句中加LABEL选项,例如:
proc print data=c9501 noobs label;
var name sex math chinese avg;
label name='姓名' sex='性别' math='数学' chinese='语文' avg='平均分';
run;
则结果如下:
The SAS System 6
姓名性别数学语文平均分
李明男 92 98 86.8333
张红艺女 89 106 88.6667
王思明男 86 90 80.5000
张聪男 98 109 94.4167
刘颍女 80 110 85.8333
实际上,我们还可以在生成数据集的数据步中使用如上的label语句,结果数据集中的变量就有了标签,在过程步中可以直接使用而不需再次用label语句定义。

标题及全程语句
我们从上面的输出结果看到,在每页输出结果上面有一行标题,内容为“The SAS System”。

事实上,我们可以指定自己的标题来取代SAS缺省的标题。

指定标题的TITLE语句的格式为:
TITLE ' 标题内容';
例如,在前一例的程序前面加上一行
title '95级1班成绩表';
则输出结果的标题为“95级1班成绩表”。

要注意的是,TITLE语句是一个所谓的“全程” 语句,“全程”语句与一般语句不同,一般语句必须用在数据步或过程步内,作为数据步或过程步的一部分,而全程语句则既可以用在数据步和过程步内,又可以单独使用(在数据步、过程步外部)使用。

全程语句的作用一般有持续性,即:全程语句的效果将持续到退出SAS 系统或用另一个同样的全程语句来修改它。

比如,我们在上面用TITLE语句指定了一个标题,那么,这个标题的作用将持续下去,虽然下一个过程没有用TITLE语句指定标题它也会出现在下一个过程的输出中,例如在上面用TITLE语句为C9501数据集的列表输出加了标题后,再运行如下程序:
proc means data=sasuser.gpa;
run;
你会发现标题“95级1班成绩表”仍出现在输出的每一页,而这个标题已经与输出内容矛盾了(现在分析的是SASUSER.GPA数据集而不是C9501数据集)。

为了取消这个标题,只要用一个没有规定内容的空TITLE语句,即:
title;
这时连缺省的“The SAS System”标题也没有了。

用全程语句FOOTNOTE可以为输出加脚注,如:
footnote '第三章例子输出';
则其后的输出每页下方会有脚注“第三章例子输出”,直到用另一个FOOTNOTE语句指定新的脚注,或用空FOOTNOTE语句取消脚注为止。

另一个全程语句OPTIONS语句可以规定系统运行的一些选择项,比如输出是否每页有页号,是否有日期,输出的行宽,输出每一页的高度(行数),等等。

其使用例如:
options nonumber nodate linesize=78 pagesize=60;
其中NONUMBER表示输出不显示页号(改用NUMBER则规定显示页号),NODATE表示不在每页显示运行日期和时间(改用DATE则显示),LINESIZE=78规定输出每行最宽不超过78个字符,PAGESIZE=60 规定输出每页为60行,不足时用空行补齐。

用BY语句分组处理
前面我们已经讲过,在过程步中使用BY语句可以指定分类变量,把观测分类处理。

在使用带有BY语句的过程之前一般用SORT过程对数据集按照分类变量排序。

例如:
proc sort data=c9501;
by sex;
run;
proc print data=c9501;
by sex;
run;
结果为:
----------------------------------- SEX=男 -----------------------------------
OBS NAME MATH CHINESE AVG
1 李明 9
2 98 86.8333
2 王思明 86 90 80.5000
3 张聪 98 109 94.4167
----------------------------------- SEX=女 -----------------------------------
OBS NAME MATH CHINESE AVG
4 张红艺 89 106 88.6667
5 刘颍 80 110 85.8333
计算总计和小计
在PRINT过程中可以用SUM语句计算某个变量的总计(总和)。

例如,9501班的同学购买课外书所用的钱数用如下程序输入数据集:
data bkmoney;
input name $ amount;
cards;
李明 20
张红艺 15
王思明 10
张聪 20
刘颍 50
;
run;
为了列出此数据集并计算全班的总书款,只要在PRINT过程中加上SUM语句,SUM语句中指定要求和的变量名AMOUNT:
proc print data=bkmoney noobs;
sum amount;
run;
结果为:
NAME AMOUNT
李明 20
张红艺 15
王思明 10
张聪 20
刘颍 50
======
115
可见总额为115元。

SUM语句中也可以指定多个变量名,可以同时对这些变量求和。

用BY语句与SUM语句就可以既计算总和也计算分组小计。

比如,我们除了要计算学生购买课外书总支出外还想分男、女生计算总支出,可以用下面的程序。

注意由于数据集BKMONEY 中没有性别的信息,我们用了带MERGE语句的数据步来横向合并C9501和BKMONEY两个数据集。

proc sort data=c9501;
by name;
proc sort data=bkmoney;
by name;
data new;
merge c9501 bkmoney;
by name;
run;
proc sort data=new;
by sex;
proc print data=new;
by sex;
sum amount;
run;
程序的结果为:
----------------------------------- SEX=男 -----------------------------------
OBS NAME MATH CHINESE AVG AMOUNT
1 李明 9
2 98 86.833
3 20
2 王思明 86 90 80.5000 10
3 张聪 98 109 94.4167 20
------
SEX 50
----------------------------------- SEX=女 -----------------------------------
OBS NAME MATH CHINESE AVG AMOUNT
4 刘颍 80 110 85.8333 50
5 张红艺 89 10
6 88.666
7 15
------
SEX 65
======
115
可见总额为115,男生小计为50,女生小计为65。

用TABULATE过程作统计量表格
PRINT过程可以制作列表,它列出所有观测。

当观测个数很多时,这样的列表意义不大。

TABULATE过程制表不是列出观测,而是计算观测的分类统计量,绘制统计量的表格。

这对于数据的汇总比较有用。

TABULATE可以作出很复杂的表,其一般格式为:
PROC TABULATE DATA=数据集名;
CLASS 分类变量;
VAR 分析变量;
TABLE 页维说明,行维说明,列维说明 / 选项;
RUN;
其中CLASS语句给出分类变量,用分类变量可以给观测分类,计算统计量时可以对每一类分别计算。

相关文档
最新文档