前面我们介绍了应用SAS实现数据集的创建、数据整理和清洗、数据的统计描述和简单的统计推断方法。在写这一期文章之前一直在纠结,是否要把SAS宏语言放在这一期开始介绍?考虑到宏语言可以实现代码的重复利用、完成复杂的逻辑判断和条件控制等,使得程序具有极高的灵活性。最后还是决定在介绍高级统计方法之前,介绍SAS宏语言。
SAS宏语言是一种文本语言,是SAS编程的一个重要组成部分,在SAS系统中起着非常重要的作用:扩展定制SAS操作,减少文本输入量,SAS编程更加灵活高效。在SAS系统中,SAS宏功能是包括宏语言和宏处理器,宏语言是用户与宏处理器交流的句法语言,宏处理器可以将宏代码转换为SAS可运行的语句,即完成宏功能。SAS系统在编译程序时,通过“&”(宏变量标记)和“%”(宏))两种定义符触发宏处理器工作。SAS宏运行机制如图10-1:
图10-1 SAS宏运行机制示意图
宏变量与SAS DATA步中的变量是不一样的,宏变量是属于SAS宏语言,宏变量具有以下特点:
★ 宏变量名最多可以包含32个字符;必须由字母和下划线开始,且由字母、下划线以及数字组成;不能包含空格,区分大小写。
★ 宏变量值是字符数据,宏变量值最大长度可达65534个字符;宏变量值若含有数学表达式,其表达式不会被计算;大小写不转换;宏变量值的头尾若有空格,在赋值时会被移除;宏变量值若包含引号,赋值时引号也会被储存。
★ 宏变量可以替代一段SAS程序文本,文本可以是一个值、一段代码或者一个表达式。
宏变量可根据来源分为用户定义宏变量和自动宏变量。根据适用范围可分为局部宏变量和全局宏变量。宏处理器在搜索引用宏变量是时,先搜索局部宏变量,如果没有再搜索全局宏变量。
SAS启动后,宏处理器就会产生自动宏变量。用户可以给具有读/写状态的自动宏变量赋值,不能给只读状态的宏变量赋值,表10-1列出了部分自动宏变量及其含义。
表10-1 按类别划分的自动宏变量
用户可以自己创建宏变量、改变宏变量的值和定义其作用范围,用户可以任意给宏变量命名,但是名称不能是宏功能的保留字,为了避免自定义的宏变量与自动宏变量混淆,也不要用AF、DMS、SQL和SYS等前缀定作为名称。义宏变量的方法有3种:使用宏程序语句%LET;在DATA步中定义宏变量;在SQL语言中定义宏变量。其中使用宏程序语句%let是最简单的方法,我们主要介绍%let宏语句,其语法如下:
%LET 变量名=宏变量值
%LET NAME=XJF; /*宏变量名NAME,宏变量值XJF*/
%LET NAME1='JINGDINGTONGJI';/*宏变量名NAME1,宏变量值'JINGDINGTONGJI'*/
%LET X=12*2;/*宏变量名x,宏变量值12*2*/
通常,在SAS程序调试过程中,用户可以通过%PUT语句来查看宏变量,%PUT语句的语法如下,:
%PUT <TEST | _ALL_ |_AUTOMATIC_ | _GLOGBAL_ | _LOCAL_ | _USER_>
%PUT语句中各选项说明详见表10-2。
表10-2 %PUT语句选项含义
%LET NAME=XJF;
%PUT “I'm &NAME”;
通常,用户定义宏变量后,用户可通过符号“&”来获取宏变量值,这个过程称之为调用宏变量,也称为宏变量的解析。宏变量的调用可分为直接调用、间接调用和隔离引用。
1. 直接调用宏变量
直接调用宏变量的语法如下:
&宏变量名;
%LET VAR=10 ;
%LET NAME=XJF;
DATA A;
X=&VAR.;
Y="&NAME.";
RUN;
图10-2 直接调用宏变量创建数据集A结果
%LET VAR=10 ;
%LET NAME=XJF;
DATA B;
X=&VAR.;
Y=&NAME.;
RUN;
图10-32 直接调用宏变量创建数据集B结果
在调用宏变量时要注意,由于宏处理器只能在双引号中进行替代,因此在调用类似于宏变量“NAME”宏变量值时,必须用双引号括住该宏变量名,否则就会出错。从图10-2和图10-3的数据集可以看出,没用双引号的数据集(图10-3)包含了三个变量,其中变量Y和变量XJF是缺失值。
2. 间接调用宏变量
间接调用宏变量也是引用宏变量的一个非常有用的方式,间接调用宏变量是通过多个“&”符号来实现的。宏处理对多个“&”的处理规则是:从左至右进行扫描,如宏变量只有一个“&”,则解析该宏变量;如果多个,则将相邻的两个“&”替换成一个“&”,再继续扫描重复以上过程。
%LET NAME8=JINGDINGTONGJI;
%LET VAR=8;
%PUT &&NAME&VAR;
图10-4 间接调用宏变量日志窗口显示结果
3. 隔离调用宏变量
宏变量可以是任何一个文本,当宏变量需要会和其他文本结合在一起时,我们就要用点句号“.”把宏变量与其他文本分隔开来,即符号“&”与“.”之间的部分是需要解析的变量名。
%LET TEAM=JINGDINGTONGJI;
%PUT &TEAM.888;
%PUT &TEAM 888;
%PUT &TEAM..TXT;
图10-5 隔离调用宏变量日志窗口显示结果
%LET D=DISEASES;
DATA &D.1 &D.2 &D.3;
SET SASHELP.BMT;
IF GROUP="ALL" THEN OUTPUT &D.1;
ELSE IF GROUP="AML-Low Risk" THEN OUTPUT &D.2;
ELSE OUTPUT &D.3;
RUN;
图9-97是两个变量的统计描述结果;图9-98是SPEARMAN相关分析结果:rs=0.90506,P<0.0001;图9-99是KENDALL相关分析结果:rk=0.73856,P<0.0001。SPEARMAN相关分析和KENDALL相关分析的结果都显示两个变量间存在直线相关。
图10-6 隔离调用宏变量创建新数据集的日志窗口显示结果
图10-7 隔离调用宏变量创建新数据集结果
用户定义的宏变量可以应用%SYMDEL语句删除,其语法如下:
%SYMDEL 宏变量名1 宏变量名2 …;
整理不易,欢迎点亮再看哦!
参考文献:
[1] 薛富波, 张文彤, 田晓燕, 等. SAS8.2统计应用教程[M]. 北京:兵器工业出版社, 2004
[2] 夏庄坤, 徐唯 , 潘红莲, 等. 深入解析SAS——数据处理、分析优化与商业应用[M]. 北京:机械工业出版社, 2014.
[3] 高惠璇. SAS系统Base SAS软件使用手册[M]. 北京:中国统计出版社, 1997.
[4] 姚志勇. SAS编程与数据挖掘商业安全[M]. 北京:机械工业出版社, 2010.
----------------------------------------------
----------------------------------------------
精鼎特邀
联系客服