jdl008

语句覆盖(语句覆盖的目的是测试程序中的代码)

jdl008 职业培训 2024-09-05 111浏览 24

  上一篇文章介绍了数据集的更改。今天,我们将介绍数据集处理的其他选项和语句。

  

  数据集选项END=

  很多情况下,在进行数据操作时需要知道SAS什么时候在处理输入数据集的最后一条观测,这时可以使用SAS提供的数据集选项END=来帮助辨识。使用数据集选项END=的基本形式为:

  在使用SET、MERGE、MODIFY、UPDATE语句时,都可以使用该选项。这里语句中的变量是数值型的临时变量,当DATA步在操作数据集的最后一条观测时,该变量的取值为1,否则为0。临时变量可以在DATA步中使用,但是不会在数据集中输出。需要特别注意的是,在使用SET、MERGE、MODIFY、UPDATE语句进行多个数据集处理时,只有当DATA步在处理所有输入数据集的最后一条观测时,该变量的取值才会由0变成1。

  例4.13:数据集work.Sales中记录了公司每位员工的全年的销售额,现在欲计算全年公司的总销售额,并输出到报表中。

  以下代码创建了work.Sales数据集,Emp_ID表示员工编号,Dept表示员工所属部门,Sales表示销售额。

  

  数据集work.sales的内容如图4.23所示。

  

图4.23 例4.13打印输出数据集work.sales内容

  现在运用END=选项计算公司全年的总销售额。

  

  输出内容如图4.24所示。

  

图4.24 例4.13打印输出work.total_sales内容

  上面这段代码中有以下几个要点:

END=last定义了临时变量last,当SAS在处理最后一条观测时,last的取值将变为1。

total_sales+sales;计算了公司的全年销售额。total_sales+sales;的作用和retain total_sales 0; total_sales=total_sales+sales;一样。

IF语句和OUTPUT语句判断了最后一条观测,并将该观测输出到了数据集中。

KEEP语句仅将需要输出的total_sales变量保留在数据集中。

  上面计算全年销售额的代码和下面的代码等价。

  

  自动变量FIRST.与LAST.

  在DATA步中若使用了BY语句,SAS要求读入的数据集必须按BY变量排序(MODIFY语句除外),同时,SAS在程序执行过程中会自动生成两个数值型临时变量:FIRST.变量和LAST.变量,它们分别用来辨识BY组合的第一条观测和最后一条观测。当只有一个BY变量时,很容易理解它的取值。

当DATA步正在处理该BY变量值的第一条观测时,FIRST.变量为1,否则为0。

当DATA步正在处理该BY变量值的最后一条观测时,LAST.变量为1,否则为0。

  当有多个BY变量时,系统会自动生成多对FIRST.变量和LAST.变量。例如,SAS在执行如下代码时,会自动生成临时变量FIRST.x和LAST.x,以及FIRST.y和LAST.y。

  

  数据集work.try如图4.25所示。

  

图4.25 数据集work.try内容

  当SAS处理第一条x=1的观测时,first.x=1;当SAS处理最后一条x=1的观测时,last.x=1;当SAS处理第一条x=1并且y=‘A’的观测时,first.y=1;当SAS处理最后一条x=1并且y=‘A’的观测时,last.y=1。

  例4.14:数据集work.Sales中 了每位员工的销售额和员工所属部门及性别数据,现在公司欲统计各部门男员工和女员工的总销售额,并制成报表。

  首先将work.Sales数据集按Dept和Gender进行排序,然后再运用选项FIRST.与LAST.计算各部门男女员工的总销售额。

  

  输出内容如图4.26所示。

  

图4.26 例4.14打印输出内容

  if last.gender;是if last.gender then output;的省略写法。这里使用了RETAIN语句,使得在DATA步的循环中sales_by_dept的值可以保留在PDV中。

  BY语句创建的这两个临时变量不仅可在SET语句读入单个数据集时使用,在多个数据集的拼接时也常使用。

  SET语句的选项POINT= 和NOBS=

  在DATA步使用SET语句读入数据集时,可使用选项POINT=指明要读入的观测序号。使用选项POINT=的基本语法为:

  其中指针变量用来指明要读入特定序号的观测,必须在SET语句执行前对它赋值。在有SET语句的DATA步程序中,系统将反复执行DATA步的语句,直到遇到数据中的文件结束标志,但是在使用选项POINT=时,系统会直接读入指针指向的记录,这就很可能导致系统不会遇到文件结束标志,容易陷入死循环。因而在按指针读入数据的程序中,经常会用到STOP语句。

  如果要取得数据集中观测的个数,可以使用SET语句中选项NOBS=,语法为:

  其中,变量同样是临时变量,在DATA步的编译阶段赋值。

  例4.15:现有一个数据集work.Whole,欲从其中随机抽取1/3的观测用来建立模型。

  示例代码如下:

  

  运行这个代码,系统将从数据集work.sample中依次抽出第1条观测,第4条观测,…,并存储到数据集work.sample,直到系统处理完数据集中的全部观测。

  使用多个SET语句

  在SAS中实现同一个操作,往往会有多种方法,作为补充,这里将介绍如何运用SET语句进行数据集横向合并。使用SET进行横向合并的一个好处是,在合并之前不需要将输入数据集进行排序。

  例4.16:以下是使用多个SET语句的一个简单例子。

  

  数据集work.data1和数据集work.data2的内容如图4.27所示。

  

图4.27 数据集work.data1和work.data2的内容

  合并后的数据集work.combined如图4.28所示。

  

图4.28 例4.16打印输出数据集内容

  在使用多个SET语句时,PDV中的变量是读入数据集的并集。首先,DATA步从第一个SET语句中读入第一条观测,并复制到PDV中;然后从第二个SET语句中读入第一条观测,并复制到PDV中。当输入数据集中有同名变量时,后读入的数据集的变量值覆盖前一个数据集中同名变量的值。新数据集中的观测数是所有输入数据集中的观测数的最小值,因为当DATA步遇到第一个文件结束标志时,DATA步就结束执行。

  例4.17:在sashelp.class中记录了一个班级学生的姓名、性别、年龄、身高和体重信息,现在针对每个小朋友,欲找出比其年龄大的小朋友的姓名和年龄,并制作成报表展现出来。

  示例代码如下:

  

  图4.29是部分输出报告。

  

图4.29 例4.17打印输出内容

  这里在PRINT过程中使用了BY语句和ID语句,BY语句可使报表按BY变量组输出列表,ID语句中的变量用来代替观测序号,置于输出的最左侧。PRINT过程在后面文章中将详细介绍。

  本文结束,下一篇文章开始介绍“使用HASH对象处理多个数据集”。

  回复【数据和代码】可以下载《深入解析SAS》一书的数据和代码。

  查询往期文章,请回复下列关键字:

  【安全】==【SAS智能平台安全管理】系列文章

  【Base基础】==【Base SAS基础】系列文章

  【编程概念】==【SAS编程基本概念】系列文章

  【描述性统计】==【SAS统计分析系列:描述性统计分析】系列文章

  【读外部数据】==【读取外部数据到SAS数据集】系列文章

  【假设检验】==【参数估计与假设检验】系列文章

  【单数据集处理】==【单数据集处理】系列文章

  【方差分析】==【方差分析】系列文章

  小贴士

  读者可以从以下链接获取SAS公司提供的免费版环境:

  SAS大学版(SAS® University Edition)是SAS为在校大学生免费提供的基于虚拟机和网页的SAS环境。回复关键字【大学版】,可以查看详细介绍。

  下载路径:

  https://www.sas.com/en_us/software/university-edition/download-software.html

  SAS学术版(SAS® OnDemand for Academics)是 SAS 为学术届人士免费提供的、在线的、基于SAS 私有云上的应用服务环境。

  用户首先需要注册,然后按照提示信息就可登录。

  注册路径:

  https://odamid.oda.sas.com

  本文转自《深入解析SAS — 数据处理、分析优化与商业应用 》

  作者:夏坤庄、徐唯、潘红莲、林建伟

  如若转载本文,请在文章顶部标注 “本文转自SAS知识 (ID: SASAdvisor),摘自《深入解析SAS — 数据处理、分析优化与商业应用 》”

  

  

  作者介绍

  夏坤庄

  《深入解析SAS — 数据处理、分析优化与商业应用》第一作者, SAS软件研究开发(北京)有限公司客户职能部总监。在承担研发工作的同时,夏及其团队负责对SAS非英语市场提供技术支持,并且与在美国及其它地区的团队一起,服务于SAS的SaaS/RaaS业务,同时提供和验证 SAS产品和技术在应用领域的最佳实践。在加入SAS软件研究开发(北京)有限公司之前,夏就职于SAS中国公司,历任资深咨询顾问、项目经理、首席顾问、咨询经理,拥有丰富的咨询和项目实施经验。在长期的从业经历中,不但为SAS的金融行业客户成功实施了众多深受好评的项目,而且在近年领导实施了非金融行业的多个大数据分析项目。

  欢迎大家投稿,一起分享SAS的点滴

  投稿邮箱: sasadvisor@outlook.com

版权声明

本文仅代表作者观点,不代表B5编程立场。
本文系作者授权发表,未经许可,不得转载。

继续浏览有关 语句覆盖 的文章
24条评论
  • 游客 发表于 2周前 回复

    很给力!http://www.guangcexing.net/voddetail/rBVTggRUfBfp.html

  • 游客 发表于 2周前 回复

    楼主很有经验啊!http://www.guangcexing.net/voddetail/DtXupDJuBJNT.html

  • 游客 发表于 2周前 回复

    很经典,收藏了!http://www.guangcexing.net/voddetail/DtXupDJuBJNT.html

  • 游客 发表于 2周前 回复

    网页的加载速度非常快,不会影响用户体验。http://www.guangcexing.net/voddetail/aFKVMrQVNUtdz.html

  • 游客 发表于 2周前 回复

    视死如归的架势啊!http://www.guangcexing.net/voddetail/aFKVMrQVNUtdz.html

  • 游客 发表于 2周前 回复

    收藏了,改天让朋友看看!http://www.lw400.com/post/4.html

  • 指尖站群 发表于 2周前 回复

    小弟默默的路过贵宝地~~~http://www.aijiu360.cn/

  • 游客 发表于 2周前 回复

    楼主你想太多了!http://www.guangcexing.net/voddetail/kfhpmAxNRzRQ.html

  • 游客 发表于 2周前 回复

    有内涵!http://uxi.njhaohai.com

  • 游客 发表于 2周前 回复

    我就搞不明白了,看帖回帖能死人么,居然只有我这么认真的在回帖!http://8n99z6.xaqrpj.com.cn