免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 960 | 回复: 0
打印 上一主题 下一主题

用PRINT过程制作列表报告 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-22 18:10 |只看该作者 |倒序浏览

本节讲解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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP