![洞察大数据价值:SAS编程与数据挖掘](https://wfqqreader-1252317822.image.myqcloud.com/cover/711/31251711/b_31251711.jpg)
4.1 数据步概述
数据步是SAS系统处理数据的核心部分,正如建一座大楼,打地基的过程就相当于数据步的过程。无论用SAS的哪个模块做应用研究和分析处理,首先都要有正确而有效的数据。数据步处理数据的优劣直接影响到其他模块分析的正确与否。其他模块都是SAS工具已经图形化了的模块,不需要去处理什么,只需要知道怎么运用这些模块,根据业务需求,通过模块功能调用数据进行分析处理即可。
4.1.1 数据步的作用
SAS系统有两大步,称为数据步和过程步。所谓数据步就是一个动态处理数据的过程,处理数据的目的是生成SAS系统能识别的数据集,数据集默认扩展名为“.sas7bdat”。
数据步处理完成后会生成一个数据表,这个数据表在SAS系统里称为数据集,所生成的数据就相当于关系数据库中的一个二维表,有行有列。数据集的属性如图4-1所示,数据集上显示数据集名“people”,当前数据集存储的逻辑库为“work”,数据集包含的列属性为id、popucount和city三个列字段称为变量,每一列对应相应的数据,行记录标识可以看到此数据集有7条记录,每一行为一条记录。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/131_01.jpg?sign=1739678967-1610Gw6OLbwHa5t5pVKwwFYw8DTk79fL-0-809ce5b2b70064bd786fb48110d3d625)
图4-1 数据集属性
数据集中的变量具有如下属性。
数据步处理数据是一个动态过程,为便于理解数据步的动态过程,可参考图4-2所示的数据步处理数据动态流程图。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/132_01.jpg?sign=1739678967-YPYFmBwIuKdvxAICF9yg7h7qrOFCFP3K-0-b556f7350ce37d9ef07608fd66809460)
图4-2 数据步动态执行机制
数据步动态流程图显示了数据步在SAS系统执行的机制,写好的数据步程序提交给SAS系统后,SAS系统首先对程序进行编译,在编译阶段进行语法检查,如果有语法错误,SAS系统就会停止当前程序,LOG日志会显示错误信息;如果程序正确,就在编译阶段创建输入缓冲区,用来存储当前数据步处理的外部文件数据或数据块中的数据,同时创建PDV(Program Data Vector)指针,通过PDV指针控制读入数据,然后执行数据步中的语句,对数据文件或数据块中的数据进行读取,自循环判断是否仍有数据未读取,当数据文件或数据块中没有数据记录了,就结束当前数据步,生成数据集存储到逻辑库对应的目录中,继续执行其他数据步或过程步。
动态数据集生成过程演示如图4-3所示。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/132_02.jpg?sign=1739678967-58PLd7r9sstf7k7tUPpUH8OD1kHTkj9M-0-e01286fb6d5223021abdbbf27f25f672)
图4-3 动态生成数据集
原始数据经过数据步程序处理,在数据步创建数据集名、变量名,读入当前数据记录,然后循环判断是否有数据,直到数据步再没有数据读入为止,这时生成数据集结束。
通过上面分析,归纳得出数据步的作用就是处理外部数据文件或数据块中的数据或对已经生成的数据集再处理等,数据步结束后生成数据集。
4.1.2 数据步基本语句应用
为便于掌握数据步,首先要理解数据步语法定义,数据步以“DATA”关键字为开始标识,以“RUN”语句为结束标识,每个语句的结束符号为“;”,具体数据步语法定义如下。
数据步语法:
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/133_01.jpg?sign=1739678967-bqlsNTKar2kIzEw58GTxqEIXF0bIJRcB-0-7b29e3540c87083d85d0fbe85cd39bc1)
表4-1为数据步语句的操作说明。
表4-1 数据步操作说明
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/133_02.jpg?sign=1739678967-F7yJpxpoIN89Up2c9skBKVwPvq1edo97-0-3a662c8282d661d967cc60757cec4f41)
为对数据步有一个整体认识,下面举一个简单例子。
【例4.1】创建a数据集。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/133_03.jpg?sign=1739678967-uh8VWhAEX44zWlEpapEgc2l75aIojRBx-0-98d20a01773969a2c8b550c95360f411)
【程序解读】
此实例虽然简单,但体现了数据步创建数据集的实现方式,a是定义的数据集的名字,name=’liulu’是对变量name的赋值语句,将’liulu’赋值给变量name,为字符类型,SAS是弱类型语言,不需要先定义。
数据步所创建数据集中的变量是具有属性的,一个完整的数据集生成的过程中需要先对变量属性识别,数据集中的变量表4-2所示的属性。
表4-2 数据集变量具有的属性
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/133_04.jpg?sign=1739678967-mrsh3Vqbyq94ObQp99yxuDTkGVl3UZQ4-0-e2552f07d5dec7a36bc9a38931d0dabf)
变量是所创建数据集中定义的变量,所定义的变量具有变量名、类型、长度、输入格式和输出格式等属性。
【例4.2】数据步中变量的定义。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/134_01.jpg?sign=1739678967-Wuj1X226qjTwWepKPlalrkqKC8W14lmS-0-4a2a6d764d1e15e9986a3aaf49e9f898)
【程序解读】
1)此实例数据步创建数据集ycr时定义了三个变量,分别是name、phone和time。变量name的属性为字符型,长度为10个字节;变量phone的属性为数值型;time的输入格式为“date9.”
2)format函数定义了变量time的输出格式为“yymmdd10.”。
程序运行完成,输出显示窗口如图4-4所示。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/134_02.jpg?sign=1739678967-QopqF5AVSGEXWcUT5bOQfsh3qzNnioF3-0-26b454641fc79d20d2851ce3d96a92e7)
图4-4 ycr数据集输出显示窗口
数据集与逻辑库的关系:数据步动态执行的过程中所创建的数据集是存储到对应的逻辑库中的,这是SAS系统管理数据集的方式,通过逻辑库可以找到此逻辑库下具有的数据集。数据集对应逻辑库分临时逻辑库与永久逻辑库两类,数据集默认存储在work临时逻辑库中,SAS系统关闭退出时数据集删除;对于需要永久保存的数据集要存储到所建立的永久逻辑库中,通过永久逻辑库把数据集存储到对应的物理路径文件夹下。逻辑库与数据集的关系见表4-3。
表4-3 逻辑库与数据集关系
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/134_03.jpg?sign=1739678967-v6fBFKs48VXuuz94EJpzPKpawtOSB7DS-0-e479fc167e2c5facc156c911321ddeaf)
(1)SAS系统默认数据集存储在Work临时逻辑库中
Work临时逻辑库用来存储不需要永久保存的数据集,运行SAS程序时如果数据集没有指明对应逻辑库,则默认存储在Work逻辑库中。当退出SAS系统时,Work临时逻辑库中的数据集就会清除。
指定数据集存储到Work逻辑库方法:
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/135_01.jpg?sign=1739678967-xF9GG4xTCBYqKOlsfABbpcsIwtNTn52U-0-9890b36109116415104140fdabf15553)
说明:Work表示逻辑库名,可以省略,默认存储到此逻辑库下。数据集名表示给数据集起名字,相当于表名,不指定数据集名默认为Data1。
【例4.3】数据集存储到Work临时逻辑库。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/135_02.jpg?sign=1739678967-knFHaD8xaOGnY9qCt7w1IcNtHrMRWdI7-0-7b1fc147bf3cbf1855cf07c1640377c3)
【程序解读】
数据集liu存储到work临时逻辑库中,当退出SAS系统后,work临时逻辑库对应的数据集自动删除。临时逻辑库一般用来存储数据处理过程中临时使用的数据集,不需要保存,这样可以节省物理存储空间。
(2)数据集存储到永久逻辑库
实际开发中经常需要把重要的数据集永久保存下来,存储到指定目录,需要指定永久逻辑库名,数据集存储到永久逻辑库的方法:
1)创建永久逻辑库:
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/135_03.jpg?sign=1739678967-pV1aHEDtMMBQicSNLEMJWxlkxaAbK7nv-0-5b44731dcd946565a6e9dc1120ef2fd6)
2)引用永久逻辑库,逻辑库相当于一座桥,把数据集和物理路径建立了连接,存储到指定的物理路径目录下,通过二级连接名建立连接:
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/135_04.jpg?sign=1739678967-o3Wr6EEMFxrVBp3EifmQFtiGfZT3xryE-0-b2da215ed28d2849c7f4bd9ca2f32954)
说明:逻辑库名表示定义的永久逻辑库名,不能省略;数据集名表示给数据集起的名字。
【注意】逻辑库名与数据集名通过英文输入法下的“.”(点)建立连接。
【例4.4】数据集存储到物理路径“d:\sastest”目录下,数据集名为lu。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/135_05.jpg?sign=1739678967-MoVBy9gm8daWe28uIu6URUiXrhYUZiE0-0-5848c42f8fca826a786093d1a3509ec3)
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/136_01.jpg?sign=1739678967-M6dgYGz72OY04qPxnvTd2N4x10Wzed0W-0-17fb3371e52907970a308adc2dafafb6)
【程序解读】
数据步执行时的机制:
1)先创建永久逻辑库xy。
2)执行DATA数据步,先对数据步程序进行编译,进行语法检查,程序编译通过后开始创建输入缓冲区和PDV指针,xy.lu把数据集lu存储到与逻辑库xy相匹配的物理路径“d:\sastest”文件夹下,input语句创建变量,通过PDV指针读取cards语句后的第一条数据,放入输入缓冲区,判断是否还有数据。如果没有则生成数据集结束。SAS系统关闭退出后数据集存储到永久逻辑库对应目录“d:\sastest”文件夹下。
数据步中一次可以创建多个数据集,实际应用中经常根据条件,选择不同的数据输出到不同的数据集。
语法格式:
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/136_02.jpg?sign=1739678967-YnKcf9tDfPp9w6ZJ9V0ZysGTmOTJRPZW-0-6303fe7124de5fcccf499adc9a32da60)
【注意】数据步一次创建多个数据集,数据集名之间以空格分隔。
【例4.5】已知外部文件存储在“d:\sastest\rk.dat”的目录下,此数据集为人口普查数据集,请把此数据文件中北京和上海两个城市的数据放在一起,生成数据集名为bjsh,其他城市的数据信息生成数据集名为qita,数据集存储到“d:\sastest”目录下。
打开外部数据文件rk.dat,数据如图4-5所示。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/136_03.jpg?sign=1739678967-Nieiipifozo07jIyE6M15MSar3O9s3Jm-0-6241761056960860ff6572ecfecb5be5)
图4-5 外部数据文件rk.dat
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/136_04.jpg?sign=1739678967-JErGQvOeB3ZGvpyz8mytr67bmIEzuSrm-0-6e043bd2e6414111c8045313d83216ec)
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/137_01.jpg?sign=1739678967-W8ZiXES7pLiybUDYxFH1JMbJ3Cgi5ZMr-0-27cb973a939b68fdaff09325efda4438)
【程序解读】
数据步通过if条件语句判断city变量,把in(“北京”,”上海”)语句中符合条件的数据通过OUTPUT语句输出到数据集xy.bjsh,不符合条件的输出到数据集xy.qita。程序运行完成,两个数据集存储到指定目录,为便于验证数据是否生成到对应数据集,执行已打印输出程序,把北京和上海两个城市的数据打印输出到窗口。输出窗口显示此数据集只有北京和上海两个城市信息,如图4-6所示。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/137_02.jpg?sign=1739678967-9TblKa1dOpDvxwHnSuW3667lvVexsVWv-0-6a3b25a9b37b5d9003f4b54be8c69ac0)
图4-6 bjsh数据集信息显示窗口
对于有上百个列变量的数据,为了节省存储,所创建的数据集有些列变量是保留的,有些列变量不需要保留。数据步中通过KEEP语句保留需要的列变量。
数据集引用KEEP语句的语法格式:
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/137_03.jpg?sign=1739678967-c7aPVNOzYtJPN66VZPWeFzw1icc0Mqpy-0-adc03eeea7a28d9f56f5554914299a28)
keep=语句可以指明所创建的数据集要保留的变量,多个变量之间以空格分隔。
【例4.6】取出学生信息中的学号、姓名、联系方式三个信息,建立数据集keep_stu。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/137_04.jpg?sign=1739678967-Q9NVeDFSctqqY9hBhOXxwYbL4b0noayL-0-8e0c166d04a94fe727781c10748c341a)
【程序解读】
数据步执行时先在内存中生成包含所有变量的数据集,然后通过keep=id name mobile取保留变量,多个变量之间以空格分隔。当前所创建数据集只包含列变量id(学号)、name(姓名)和mobile(联系方式)。
对于所创建的数据集,如果删除的列变量少,保留的列变量多,为了程序的可读性,可通过DROP语句删除不需要的列变量,DROP语句实现了与KEEP语句功能相反的作用。
DROP语句删除数据集变量的语法格式:
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/138_01.jpg?sign=1739678967-Gujc7gUpOFXPfeKPRi2ZoZ49USKhASrg-0-ad088063fcf27281cbfd08292ad4a37d)
drop=语句可以指明所创建的数据集要删除的变量,多个变量之间以空格分隔。
【例4.7】对【例4.6】进行改造,通过DROP语句剔除不需要的变量,创建符合条件的数据集。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/138_02.jpg?sign=1739678967-eNRJVtm43UpdmnYWaAPej0Oa0j0VSXUI-0-6c60c71a127507d07906125b02a3fd65)
【程序解读】
此程序通过drop=sex mobile语句去掉不需要的变量,实现了创建符合条件数据集的要求。
【注意】KEEP参数选项和DROP参数选项不能在一个数据集中同时使用。KEEP语句与DROP语句对变量处理的方式相同,只是KEEP语句保留变量,DROP语句剔除变量。
数据步若只做数据处理,不建立数据集,则需要把数据集的名字命名为“_NULL_”,以此来告诉SAS系统不创建数据集,只是做数据处理。
数据步只做数据处理的语法格式:
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/138_03.jpg?sign=1739678967-XmB6NzkhvXgCwgnWC8qFW7pd1hJtSQWD-0-c974c22eda4acc76eecf50cbcb49dfef)
【例4.8】不创建数据集,根据数值类型变量x和y,求x+y的和,结果赋值给数值型变量z。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/138_04.jpg?sign=1739678967-kIlEZTBa59SFELran1yCwWLADeStL3Ha-0-c04a56e690b09cebb4fe7289aa9fc443)
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/139_01.jpg?sign=1739678967-tAE14EmXZqaBNw24WSMw7iIePM7MRYXv-0-3b8b5dfd09fa7ac851266af2c7d7540a)
【程序解读】
此数据集名为_null_,告诉SAS系统不创建数据集,只是执行数据步中的SAS处理语句,求x+y的和,通过put语句把求和结果输出到日志窗口显示,如图4-7所示。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/139_02.jpg?sign=1739678967-sEELYf8MWTo8aJH4mZmzeZjspSg5OKCI-0-b741b5f381c849e786cebf7c1c62eaa6)
图4-7 不建立数据集日志显示窗口
数据步用来修改与选择观测语句,可以在数据步中进行计算、数据集修改、对数据集观测子集选择以及输出控制等。具体见表4-4。
表4-4 数据步修改语句与数据集选择观测记录语句
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/139_03.jpg?sign=1739678967-R4KENNCcQG0Q6xogD8iFc19yiiDX7rnI-0-54f273665a0624d1853391d71615d74e)
以上语句众多,只对经常用的详细讲解,其他不经常用到的读者可以查看SAS帮助文件。
(1)DELETE语句
Delete语句可以清空数据集,可以把符合条件的数据从数据集中删除。
【例4.9】DELETE语句清空数据集的应用。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/139_04.jpg?sign=1739678967-B889XkiT7OABiOMbsYNHxbn8wVf7N1kD-0-4e1d74e7d4b6aaad908dcc49fc5ae4a2)
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/140_01.jpg?sign=1739678967-hOrxHJNXNHpPnQapjV1TUhVILeTA0QaI-0-a941dcf8bc045657705a6b6ec78016a2)
【程序解读】
数据步程序执行到delete语句会把数据集qk中所有观测记录删除,即清空数据集qk。对于一些过渡的数据集,只是做中间处理用,经常用delete语句清空当前数据集,以节省存储空间。
【例4.10】DELETE语句删除数据集中符合条件的记录。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/140_02.jpg?sign=1739678967-ImiSGD6u8DWXAMYEGrOcPWCWaec2bYYG-0-8fcc70a25b93fb1ed95da6860f67e7d4)
【程序解读】
数据集在创建的过程中读入if type='B'语句,对于符合条件的数据执行delete语句,从数据集中删除。Delete语句可以用来过滤数据集中的数据。
(2)STOP语句
STOP语句对处理的当前数据步起到强制停止作用,当前数据步遇到STOP语句时,正处理的数据不会被添加到新数据集。
【例4.11】STOP语句停止当前数据步。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/140_03.jpg?sign=1739678967-WypgvnGLEA8RIiNZYcPOaWefT7cIAzHt-0-df8f909f58faff422bab0132b80fd1d0)
【程序解读】
此数据步程序通过数据步自动变量_n_记录的观测序号控制读入观测记录,当_n_=5(即观测序号为5)时停止当前数据步,此时数据集中第五个观测序号的数据没有添加到数据集stopsj,数据集stopsj只有四条观测记录。
(3)ABORT语句
当数据步执行过程中遇到ABORT语句时,可以终止并跳出当前数据步,继续执行其他数据步或过程步。
【例4.12】ABORT语句对当前输入错误的数据给予终止,继续执行下一个数据步或过程步。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/141_01.jpg?sign=1739678967-T7s6NL6ylHCMz9fAoaJsFvBwcZp0Tsn2-0-eeb046e862b1fe061f9e2b747b9b1fc7)
【程序解读】
if语句中的_error_记录错误信息,当_error_=1时,显示读取存在错误,执行abort语句结束当前数据步,继续执行下面的打印过程步。数据集abortsj只有一条记录。
(4)WHERE语句
WHERE语句对处理的数据集根据条件过滤,where语句后面可以匹配的表达式见表4-5。
表4-5 where语句表达式
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/141_02.jpg?sign=1739678967-B6A8MespXHCxSKxy5mSYh3v8n4KIg5lg-0-1895cee2eee6f561ab00cb7c43c35684)
理解WHERE语句具有的表达式是灵活运用WHERE语句的前提,下面结合实例对WHERE语句表达式进行详细解读。
【例4.13】根据where语句中“变量名=变量值”过滤数据集。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/141_03.jpg?sign=1739678967-AmCD9T0t21mjeqHdwCD6N93HHXaJMGPY-0-8ee618d004965623b3bacfe5be20117e)
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/142_01.jpg?sign=1739678967-Ch0gW27KPhzSEzM18wYi2IzvbBrWXgTD-0-ecad5bfb1d6084c67f1beac3c37f4a1e)
【程序解读】
对数据集lu,通过where type='及格'条件进行过滤,把type='及格'的观测取出来,建立数据集where。
【例4.14】根据where语句中“between and”表达式过滤数据集。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/142_02.jpg?sign=1739678967-fMD0xStdxQNgWxNc7Ns2ZlkabtQCcqTV-0-4f3e21d4460f5fa5d225b69cf5e91d03)
【程序解读】
根据price变量的价格过滤,取值范围为[5,10]的闭区间,包括开始值和结束值。
【例4.15】is null和is missing语句写法一样,可以通过对【例4.14】改造来讲解Where语句查找价格为空的观测数据。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/142_03.jpg?sign=1739678967-fHe9VRCo9wrydayHHEMZbCmd9MLuJ4VS-0-63b7ca04492a80f87124cf1375746cf5)
【程序解读】
where语句查找price价格为空的观测数据,建立数据集sqnull。也可以通过“where price is missing”语句替换,达到查找数据集中缺失值的目的。
【例4.16】like语句属于模式匹配的语句,对【例4.13】进行改造,把姓“李”的找出来。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/143_01.jpg?sign=1739678967-0NWSOomJZkYxc0zB6rxjNBBxywCUhrrY-0-e521302e7da2e78e71665ed4b0e4e2f2)
【程序解读】
where语句根据name变量,通过like模式匹配语句'李%',把以“李”开始后面含有多个字符的姓名查找出来。对于like语句否定的形式可以写成not like,可以取出不以“李”姓开始的姓名。
【例4.17】对same and语句可以和上面的条件语句一起使用,可以起到增加条件判断的功能。对【例4.14】的where语句进行改造,实现同样的功能。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/143_02.jpg?sign=1739678967-G9DoDStvDN4xZLbiyGB4MegmVGMRJ8W4-0-7278dc4235b5914d36b179dc5e3abde7)
【程序解读】
对同一个程序不同的改造可以对比发现哪条语句效率更高,这也是学习SAS语言的又一种好的方式。此列通过借助same and条件实现了【例4.14】的功能。
【例4.18】in语句可以取常值,属于几何范围,对【例4.14】程序进行改造,取出sg变量对应水果为“橘子”和“草莓”的观测数据。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/143_03.jpg?sign=1739678967-hDuL2h3okqmtY0sdt1iJPT5Ia2rqIkQp-0-62ba9ad0ee0626634f541d0f8c25c005)
【程序解读】
in语句是取此变量包含对应常值的观测,属于离散型变量,要做到举一反三,in的对立面是不在这个范围内的,上面程序若取出水果中去掉“橘子”和“草莓”的观测数据,条件语句可以改写为:
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/143_04.jpg?sign=1739678967-vJMoialbtgCCs81plYMHfDCS1b3aJZwy-0-84f4cf83ec6fdf472a45f122aad929f4)
以上知识点结合实例详细地讲解了如何创建数据集,上面的程序输入到编辑程序窗口运行,就可以直观感受建立数据集的各项功能,从感性认识上升到SAS语言处理的理性认识,要在改造程序中去学习和体验数据步的每一个知识点和功能点。
4.1.3 数据集整理
数据集整理是对已经生成的数据集再处理,就相当于盖一座大楼,打地基时需要每块砖的融合和搭配才能把地基建好。一个砖就相当于一个数据集,砖与砖根据需求互相搭配和融合的过程就相当于数据集之间的数据整理的过程,生成符合需求的数据集。归纳得出数据集整理是对数据集的再处理,相当于再加工,根据业务需求生成满足业务的数据集。
数据集整理常用语句见表4-6。
表4-6 常用数据集整理语句
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/144_01.jpg?sign=1739678967-gpR1ROSVZLV1Y4JlbMtxeBqc86QCmI5p-0-123b3a281225f5f904c683dadc0a2b9c)
下面对数据集整理的每一个语句知识点进行详细讲解,以便于灵活运用这些语句,做到举一反三。
1.SET语句整理数据集
SET语句对生成的一个或多个数据集进行处理,可以实现对多个数据集复制或纵向合并等功能。在读取数据集时严格按照数据集动态生成机制处理数据集,每一个观测先读入到PDV指针中,多个数据集需要多个PDV指针控制,处理机制不变。
语法格式:
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/144_02.jpg?sign=1739678967-33i090G9Yk80AghfZCsEeMJjJZYAOOZk-0-91e57b852f3ded7b1992d0c57d280f62)
该语句功能是复制数据集或纵向合并数据集。其语句说明见表4-7。
表4-7 SET语句说明
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/144_03.jpg?sign=1739678967-P9wTUd5aluHUISNNnJ6N3lFDzgQfONDz-0-43faebf8aba7da8f056186088fdd6307)
●END=变量名:规定临时变量,作为文件结束的标识。
●POINT=变量名:指定读入数据集观测序号。
●KEY=索引名:创建一个新自动变量_IORC_,显示I/O操作的观测序号。
●KEY=UNIQUE:从数据集索引开头开始搜索。
【注意】SET语句处理数据集时是先对原数据集读取,把读取的数据逐条放到PDV中,然后输出到一个新数据集中,占用了两个存储空间,一个原数据集存放空间和一个新数据集存放空间,直到数据处理完成,才删除原始数据集。SET处理数据集的过程中产生了一个副本数据集。
(1)SET语句的调用
SET语句中选项比较多,但调用方式一样,下面对point=选项通过实例进行讲解,其他选项可以通过改造此实例来理解运用。
【例4.19】POINT=选项应用,取指定的一条观测记录。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/145_01.jpg?sign=1739678967-7n4xxkr1fUobWpNPubH4smOYdhfT5P4j-0-0ee77c6229ccd5834bd8935ea1e0617b)
【程序解读】
1)数据步首先生成数据集point,然后执行下一个数据步。
2)第二个数据步编译后,执行n=3语句,变量n被赋值为3。
3)读入SET语句中的数据集,直接取point=3的第三条观测记录,其他记录跳过。
4)执行output语句把第三条观测记录输出。
5)执行stop语句结束当前数据步。
【注意】point=选项要和stop语句配合使用,否则数据步会继续SET语句判断,产生死循环。同时要注意point=后面是变量,不是常数。
(2)SET语句实现复制数据集
所谓复制数据集是对原数据集的再处理,生成新的数据集,新数据集具有原数据集的属性,只是生成的新数据集是满足业务需求的数据集。
数据集复制动态流程演示如图4-8所示。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/146_01.jpg?sign=1739678967-KRxvYOZ2uqpZ9oYoJJgN5y6zZd2uLO5G-0-049e73c601cfe8838b24e725c2620693)
图4-8 SET语句复制数据集流程
数据集a通过数据步程序的SET语句复制变量class和name两列,生成数据集b,数据集b具有数据集a的数据属性。观察此流程图可以看到数据集b中的class和name两变量对应列的数据和数据集a中的class和name两变量的列数据相同。
【例4.20】数据集student,根据业务需求,只保留班级和姓名两变量,建立数据集stu。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/146_02.jpg?sign=1739678967-TvHQmZGpDw1tv1SQcJBcpdU0rLjsLJuN-0-fc0da260e218ed3fdc8c58794e9db133)
【程序解读】
SET语句对student数据集进行复制,通过keep=语句保留变量class和name,程序运行完成。输出窗口显示数据集只有class和name两个字段,如图4-9所示。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/147_01.jpg?sign=1739678967-ScLMYGN734ZjykNMU4W9C6oeoY8kXqFc-0-440999a6960f314f7549091db385aece)
图4-9 复制数据集输出显示窗口
(3)SET语句的处理
SET语句可以对复制的数据集中的变量进行处理,根据需求引入函数对所复制数据集变量进行处理,这说明SET语句与其他SAS语句可以联合应用作用于数据集,生成新数据集。
【例4.21】求【例4.20】数据集student中每位学生三门课的总成绩,生成数据集stu_total。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/147_02.jpg?sign=1739678967-4MU083pPkr8I1ap41W5SalvhuEn41byr-0-65b1c6e159279c6c4f04b7320eba3e5b)
【程序解读】
SET语句读入要处理的数据集student,然后SUM求和函数对读入的数据集变量chines、Enlish和math数据求和,赋值给变量total。
程序运行完成,输出窗口显示通过函数SUM求出学生三门课的总成绩,如图4-10所示。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/147_03.jpg?sign=1739678967-4WMKKYXtbnUlemn0zkMoF7umM3yHI0HA-0-55493dabd090f8b63171d309de7b6388)
图4-10 stu_total数据集输出显示窗口
(4)SET语句的合并
SET语句可以实现相同属性数据集纵向合并,对两个或多个相同属相的数据集合并成一个数据集。实际开发中经常遇到相同属性数据集分成几个数据集存储,为便于分析数据集,需要对数据集合并,纵向合并数据集流程演示如图4-11所示。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/148_01.jpg?sign=1739678967-l0yANeFwMJ5pJq3cnZtqIDNTRXTvtZbn-0-e8450e52ab0d9d3bd166f79cc5077acd)
图4-11 纵向合并数据集流程演示图
纵向合并数据集演示可以看出合并后的数据集记录总条数为数据集a和数据集b的总和,生成新数据集c,变量名没有变,只是数据合并到一个新数据集c中。
【例4.22】请把公司两个运营部门各自的员工信息数据集合并成一个新数据集,数据集名为mergeemp。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/148_02.jpg?sign=1739678967-CufC0TH70vunfmlfdz5KXNbiSqcPcDy3-0-7f49a133c09240aa2655d174b0656b39)
【程序解读】
SET语句对employee1和employee2两个数据集纵向合并,两个数据集的变量名相同,新数据集属性与原数据集属性一致,合并后的数据集mergeemp数据记录为employee1和employee2两个数据集记录的和。
【注意】SET语句纵向合并数据集的条件是两个数据集的结构必须一样,列变量相同。合并后的数据集为两个数据集记录的和。
(5)SET语句引入条件语句
SET语句可以引入WHERE条件语句过滤数据集,提取出满足条件的数据。WHERE语句首先对数据集处理,满足WHERE语句条件的数据取出来放入输入缓冲区,然后PDV指针继续查找下一条记录,直到把所有符合条件的数据取出来,处理完毕后生成新数据集。
【例4.23】个人信用卡开卡等级评分量表,请根据等级评分量表把评定级别为优和特优的客户找出来,建立数据集superior。
个人信用评级分值区间和个人开卡信息见表4-8和表4-9。
表4-8 个人信用评级分值区间
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/149_01.jpg?sign=1739678967-BqsWHoTKTGdbm8i32yL0pbFdmrbbGEjF-0-e6a71dd175b5d1a9f210be239af85bea)
表4-9 个人申请信用卡开卡信息
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/149_02.jpg?sign=1739678967-AYJugiyqG1WcbssIwWHk00LYBAvV1VXR-0-9e3b316ad6f43dc4fda32fd210a3e015)
根据申请信用卡信息创建credit数据集。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/149_03.jpg?sign=1739678967-pkfDVLXkKrAaEnR4EoswXuXdu4em2OcZ-0-776c1a675f488418702472fcaa093472)
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/150_01.jpg?sign=1739678967-uhRNEp2n2KPvcAXJulYqcFrTzfsqWsKx-0-7041eece42654114f45e4af348c7f19f)
【程序解读】
where=(ratings>=85)首先把评级分值大于等于85的客户提取出来,然后放入输入缓冲区,继续提取符合条件的数据,直到把所有符合条件的数据提取出来,然后生成数据集superior。
(6)SET语句引入参数
SET语句可以引入FIRSTOBS=和OBS=选项参数控制提取数据集的记录。
●FIRSTOBS=:指定从数据集的第几条记录开始提取数据记录。
●OBS=:指定读取到数据集的第几条记录结束。
【例4.24】从手机用户信息数据集mobile中第3条开始取记录,到第6条记录结束,建立数据集mob。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/150_02.jpg?sign=1739678967-dqoBk2XxaHYxE5xL6Er0hAUIZ7ZarbLP-0-5d78908b52ade8827e4416f27fe650d8)
【程序解读】
SAS执行时首先对数据集mobile根据firstobs=3和obs=6把数据集中的记录从第3条提取到第6条结束,然后通过SET语句复制内存缓冲区的数据,生成新数据集mob。
(7)SET语句给列变量改名字
SET语句可以引入RENAME语句选项给列变量改名字。实际开发中如果在合并多个数据集时数据集属性相同,只是有的列变量名不同,需要用RENAME语句修改列变量名,统一要合并数据集的列变量名,然后才能合并数据集。
修改列名的语法格式:
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/151_01.jpg?sign=1739678967-ne9vufK1GAnEXhgbsAggEOpNcpFNVbtK-0-a64e591802f83c0f81508333b87cb4bc)
语句功能是对数据集中的列变量名进行修改。
下面通过两种方式对比修改列名,一种是直接在创建数据集时修改列变量名,另一种是通过SET语句引入RENAME语句选项修改列变量名。
【例4.25】创建数据集时把employee2数据集的id变量名改名为department变量名。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/151_02.jpg?sign=1739678967-7doWe9y7dgO5Sk30zexrwblFq6Ce8oMm-0-ebb33d6f1deb2eb1802521f2cf723f7e)
【程序解读】
此处RENAME用在了INPUT语句后面,对数据集中的列变量名进行了修改,【例4.26】将把RENAME语句用在SET语句中,也可以起到同样的效果。对比中学习编程更能理解SAS语言的不同之处。
【例4.26】请把员工部门employee2数据集中的变量id改为department,然后合并员工部门employee1、employee2数据集,生成新数据集mergeep。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/151_03.jpg?sign=1739678967-GTSxgFeFHXGhQFVHlM1S5xKgvxtwxr4k-0-8569699ddd90c24fc39533d52cc186a1)
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/152_01.jpg?sign=1739678967-PEIZ2SoE7z0cWgh0obnblfn5OuMuUqIj-0-b4396aa0e7a74ce72801c2a94e488fa4)
【程序解读】
SAS系统先对合并的数据集通过rename=语句修改列名,统一变量名后通过SET语句合并数据集。
(1)MERGE语句整理数据集
语法格式:
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/152_02.jpg?sign=1739678967-E6UAQyEc8SxFi5FaCHWFnW3ayrgE1kdJ-0-6760c9bb42b7a2a0c27a1dda4a7cceae)
语句功能:实现数据集的横向合并。
MERGE语句说明见表4-10。
表4-10 MERGE语句说明
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/152_03.jpg?sign=1739678967-wHwl2LfmwGUpYkxf4xf5SUExvVyQl0Ty-0-17a9cefcab01988fc02d709fb4eea9c3)
MERGE语句将两个或多个数据集进行横向合并,所谓的横向合并就是两个不同的数据集拼接在一起。实际应用中可能一个表数据列变量太多,可以把数据存储在两个数据集中,通过MERGE合并,得到完整数据集。横向合并数据集流程演示如图4-12所示。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/152_04.jpg?sign=1739678967-KTqfSBl635rd4RkJRIvRVPQVsmynh2Pm-0-496eda8f837fa920e4aa6195f1c8b4bf)
图4-12 横向合并演示图
【注意】MERGE与SET语句区别:MERGE语句实现横向合并;SET语句是将两个或多个数据集纵向合并,SET语句还有复制数据集的功能。
MERGE语句在横向合并数据集时分为一对一合并和匹配合并两种。
1)MERGE一对一横向合并数据集,所谓横向合并是对两个或多个数据集横向拼接成一个数据集,将两个或多个数据集中的第一条观测记录合并成新数据集的第一条观测记录,第二条观测记录合并成新数据集的第二条观测记录,依次类推,没有的用缺失值替代。
【例4.27】生物实验中一个anmal数据集(见表4-11)中记录了实验动物的编号和动物名,另一个anmtest数据集(见表4-12)中记录了实验动物所吃饲料名、时间长度和体重增加量。横向合并数据集,生成新数据集anmal_test。
表4-11 anmal数据集
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/153_01.jpg?sign=1739678967-DW5bSxUuvpMxWL7NtLKbdRALxJYzpV6X-0-fc630dd4e7430d198ebc2ae974ce892e)
表4-12 anmtest数据集
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/153_02.jpg?sign=1739678967-bDG2xuLjNCNIqvvM7WjsURuvwKhhzPc9-0-9cd26fcdc607654d489df28515e5ef7d)
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/153_03.jpg?sign=1739678967-QrnAhPIIbTBStHzT9GaTRj2m10hqd6mj-0-c6113ff7e1511d96e7b1ce7fd1b709c7)
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/154_01.jpg?sign=1739678967-UHG4qyD6kmv5uuDjW6TT6bljd6QIVBgr-0-e1ec2d930e0915ec25c831b6dc270a4e)
【程序解读】
两个数据集横向一对一合并时记录条数相同,合并后数据集如图4-13所示。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/154_02.jpg?sign=1739678967-vjogBHK79po4JwjAR5jaD63IaTDRQThS-0-64c475e748fb4a7c4ad970d846a0e9fa)
图4-13 横向合并后的anmal_test数据集信息
2)MERGE语句匹配合并,根据BY语句指定的公共变量的值实现横向合并,此处的BY语句中的变量相当于一个表的主键,也就是根据主键横向合并,要先对公共变量进行排序,然后再进行合并。
【例4.28】信用卡信息分为信用卡客户信息数据集credit_cust(见表4-13)和积分信息数据集credit_score(见表4-14),根据卡号横向合并客户信息数据集和积分信息数据集,生成新数据集cust_score。
表4-13 客户信息数据集credit_cust
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/154_03.jpg?sign=1739678967-aQhzrVyt4QP38UvWBspbETv9jdPU7Owh-0-951737890dbc8b64154812b024e0b077)
表4-14 积分信息数据集credit_score
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/154_04.jpg?sign=1739678967-uWLl1bN41eROAbgs9zxgkWOD6LoQV182-0-d847420f7fca2da09c39b1a9d11f623f)
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/154_05.jpg?sign=1739678967-1sTqsEci9WTP3fpmuKzSUOUaMjgGl4RV-0-59597c7f2b3d879f9bada41d56c261f1)
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/155_01.jpg?sign=1739678967-s9gBDshEGetx6XCjPmI1eqqF1ZscVBXQ-0-4081921fefbf51a4698d5f80ff867f2f)
【程序解读】
对数据步生成的数据集credit_cust和credit_score根据card_id进行排序,然后通过数据步中的merge语句根据card_id变量匹配合并数据集。
(2)MODIFY语句整理数据集
语法格式:
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/155_02.jpg?sign=1739678967-da3PqBBlhk1pvpyB41EUaPdi6bJrzSWA-0-6efa6dd02a66a68c382f4e025c2bd624)
语句功能:对已经创建好的数据集进行修改,不能修改SAS数据集的描述部分,如添加一个新变量。可以对已经存在的数据集替换、删除和追加观测。MODIFY语句可以通过DATASETS过程修改数据集。MODIFY语句说明见表4-15。
表4-15 MODIFY语句说明
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/155_03.jpg?sign=1739678967-4JSnkhlVyjBFo6A7pfEeQxwy8vmV8PMz-0-ef24cdc17956f409a0c34f1cd1dc5fea)
MODIFY语句修改数据集中的某个变量的属性,可以对变量类型进行修改。MODIFY语句修改主数据集时是在PDV指针中直接修改的,不需要另外输出到第二个数据集,不需要产生副本数据集。是对原数据集上的处理。用时要注意,如果修改数据集时突然异常中断,可能会造成数据的丢失。
【例4.29】修改信用卡客户数据集,把变量卡号的数据类型改为$16.。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/155_04.jpg?sign=1739678967-XRMdJMUZMIU9pPA3NhxMfaDDoZmTCxh5-0-c86f60483400674c3aeafa9fa06d73ce)
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/156_01.jpg?sign=1739678967-CZyvBdORZW8nmmvayqyd8HiqfCCOvqMi-0-dc9bb6380bde13857e7aa69aaeae02c4)
【程序解读】
调用datasets过程,此过程通过MODIFY语句修改数据集合credit_cust1中的变量card_id,定义输出格式为“$16.”。
(3)UPDATE语句整理数据集
语法格式:
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/156_02.jpg?sign=1739678967-mD3Wv3Q2NTjwZqa7DMJr31Wk1VBPP4pj-0-5c2b626f221c7accb2f32b3b2e97ae7d)
语句功能:一个数据集更改另一个数据集,可以添加新变量。UPDATE语句说明见表4-16。
表4-16 UPDATE语句说明
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/156_03.jpg?sign=1739678967-dZnLIn23JdjRKGfiagW9kQ45kPzLGR4W-0-d23bbb07b04c3eed6520ee3a1168fba9)
UPDATE语句可以对原数据集有错误的数据进行更正,通过一个修改数据集中的观测修改主数据集。
【注意】UPDATE语句一定要和BY语句一起使用,主数据集中的共同变量必须是唯一值,副数据集根据共同变量的观测修改主数据集。
【例4.30】对【例4.28】生成的客户信息数据集credit_cust作为主数据集,积分信息数据集credit_score作为副数据集,生成cust_infor数据集。
![](https://epubservercos.yuewen.com/A26672/16923818205021806/epubprivate/OEBPS/Images/156_04.jpg?sign=1739678967-srb00TCawpEcgVQMzjKo9ggP6q8oFtq6-0-85933b6f85e874b45ffdf4dfe81f8c73)
【程序解读】
根据card_id,通过update语句用credit_score更新数据集credit_cust。
【注意】UPDATE语句修改数据集先对数据集排序,与BY语句一起使用。主数据集中BY语句指定的公共变量必须是唯一值,当主数据集根据指定公共变量进行更新时,如果主数据集里有重复记录,只更新重复记录的第一条记录即可。