许多时候都需要把数据体内每一行写成一页报告,例如对世界主要国家的经济作主成分分析时,SAS的princomp过程(该过程本书暂不介绍)能对每一国家计算出主成分得分,每一国家的主成分得分成为一个数据行,全部数据行成为一个数据体。根据每一国家的主成分得分数据行可以对每一个国家作出结论,这就需要把数据体的每一行写成一页报告。5.1.1节中已介绍,如何用file语句配合put语句输出数据体,这儿介绍用file和put语句配合_page_把一个数据体的每一行变成一页报告的输出方法。本节举一个实例说明如何把全单位月收入总表打印成每个人的工资单。读者可以尝试由数据步制表,例如需要从全班每个学生的体检数据打印出分析每个学生体质的分析表,或由全班学生考试成绩和评语打印每个学生的“成长的脚印”表。
把数据体的每一行转换为一页报告时可以采用put语句,其一般形式是:
其中,字符串可以随意设置甚至含有中文字符或空格,字符串1在各页中被打印出同样的值,字符串2在各页中被打印出同样的另一个值……而且字符串可以单独使用,它的后面不一定要跟着变量。每个字符串的最后部分要多保持几个空格,以免与后面的字符串或变量值距离太近。变量1,变量2……指示SAS在第1页打印变量1,变量2……的第1个观测值,在第2页打印它们的第2个观测值……put语句中可以有选项:“@n”和“/”。“@n”表示后退n列,“/”表示换1行,“//”表示换2行,即空1行再换1行,依此类推。
put_page_语句的一般形式是:
它表示每页到此终结,命令SAS按照之前规定的行和列内容,在各页打印相同的字符串,并打印各数据行的变量观测值。
程序中最好有title语句,以便清空以前程序遗留的各种标题。
例6.1是根据某单位3名工作人员的原始收入情况,求出实际发给各人的每月工资数,并打印每个人的月工资单。有关数据是根据网上资料假设的,可能与实际情况有一定差距。
例6.1 设某单位3人的6项原始工资如表6-1所示,并假设住房补贴为表6-1中前两项收入和(用heji1表示)的10%。当前两项收入和(heji1)小于4500时,所得税率为前两项收入和(heji1)的10%;当前两项收入和(heji1)大于4500时,所得税率为前两项收入和(heji1)的20%。实发工资时除扣除所得税外,还要扣除两项:前两项收入和(heji1)的11%作为个人上交公积金以及每人上交养老金160元。试制作一个工资总表并打印个人工资单。
表6-1 某单位3人的6项原始工资
解 程序的开始最好使用以下两条语句:
以去除页面右上角的日期和页数等输出内容,并消除可能残存的标题设置。以变量xingming、jibengongzi、gonglinggongzi、jiangligongzi、chuqinbuzhu、diqubuzhu、chebu分别表示姓名、基本工资、工龄工资、奖励工资、出勤补助、地区补助、车补。可用如下程序:
提交程序后生成文件d:/test3.txt,打开文件d:/test3.txt得到3页报告,如下所示:
2016年2月工资单
姓名 赵甲
基本工资 2800
工龄工资 180
奖励工资 300
出勤补助 600
地区补助 500(www.xing528.com)
车补 500
税率 0.1 扣税 298
养老金 160
公积金 327.8
实发 4392.2
2016年2月工资单
姓名 钱乙
基本工资 3300
工龄工资 480
奖励工资 300
出勤补助 600
地区补助 500
车补 800
税率 0.1 扣税 378
养老金 160
公积金 415.8
实发 5404.2
2016年2月工资单
……
这就是3位工作人员的工资单。
为了提高运算速度,可以将data语句名改为“data_null_;”,这样一来就不建立数据集,可以节省CPU运算时间。
练习题 已知某小学3名学生的语文、数学、英语成绩以及部分政治思想表现评语如表6-2所示,试打印每个学生的“成长的脚印”表。
表6-2 3名学生的语文、数学、英语成绩以及部分政治思想表现评语(其中后3列得1则表示学生评语中有变量名字,如乐观活泼、团结友爱等;得0则表示没有)
思考题1 编程序统一打印全班毕业生求职表。
思考题2 编程序打印医疗保险费表。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。