- 论坛徽章:
- 0
|
本节讲解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 李明 男 92 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 李明 92 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 李明 92 98 86.8333 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 106 88.6667 15
------
SEX 65
======
115
可见总额为115,男生小计为50,女生小计为65。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/69783/showart_699519.html |
|