在SAS的DATA步可以调用SAS函数,在SAS宏语言中也有一些函数,SAS宏函数与SAS函数还是有区别的,一般在函数有带有宏符号“%”的是宏函数。这一期我们介绍宏函数。
宏函数可扩展宏变量和宏程序的应用,可用于开放代码和宏程序。宏函数的参数可以是文本字符串、宏变量、宏函数和宏程序调用。宏函数的结果总是文本,可以分配给一个宏变量。宏函数也可以直接插入到SAS语句中,以构建SAS语句。宏函数的作用包括: ★ 提取宏变量的子字符串; ★ 搜索宏变量的字符串; ★ 宏变量的值转换为数字,使用宏变量计算; ★ 在宏语句中可使用SAS语言函数和由SAS /工具包创建的函数; ★ 可把分号视为一个文本值而不是一个语句的终止符。 宏函数可分为5类:宏字符函数、宏运算函数、宏引用函数、宏变量属性函数和其他宏函数。我们将从这5类进行简短的介绍。 宏字符函数对文本字符串或宏变量进行操作,这些函数可修改它们的参数或提供参数的信息。SAS语言中的字符函数与宏语言函数相对应。表10-3列出宏字符函数及其意义。 表10-3 宏字符函数的语法与说明
![](http://image109.360doc.com/DownloadImg/2020/10/2319/205328439_1_20201023070830428_wm)
表10-4 宏字符函数的应用与举例 ![](http://image109.360doc.com/DownloadImg/2020/10/2319/205328439_2_20201023070830710_wm)
宏运算函数有两个:%EVAL和%SYSEVALF,处理算术和逻辑表达式,算术和逻辑表达式由操作符和操作数组成。宏运算函数将一个函数参数临时转换为数字,以便有完成计算,宏运算函数将返回的结果转换为文本。 算术表达应用算术运算符,如“+”和“-”;逻辑表达应用逻辑运算符,如“>”、“<”和“=”。%EVAL函数可将整数(和十六进制数)的字符串转为整数,进行算术和回逻辑运算,也可将代表算术、比较与逻辑的符号转化成宏范畴的符号。%SYSEVALF函数使用浮点算法计算表达式,可以处理包含浮点或者缺失值的宏函数,%SYSEVALF函数中的常用转换格式有布尔型(BOOLEAN)、取整(INTEGER)、取上整(CEIL)、取下整(FLOOR)。 %EVAL函数的语法如下: %EVAL(算术表达式|逻辑表达式) %SYSEVALF函数的语法如下: 5SYSEVALF(算术表达式|逻辑表达式<,转换格式>) 表10-5 %EVAL和%SYSEVALF函数应用的举例 ![](http://image109.360doc.com/DownloadImg/2020/10/2319/205328439_3_20201023070830803_wm)
表10-6 宏引用函数的语法与说明 ![](http://image109.360doc.com/DownloadImg/2020/10/2319/205328439_4_20201023070830960_wm)
表10-7 宏引用函数的应用与举例 ![](http://image109.360doc.com/DownloadImg/2020/10/2319/205328439_5_20201023070831241_wm)
宏变量状态函数有3个:%SYMEXIST,%SYMGLOBL,%SYMLOCAL,这些函数主要可应用于判断宏变量的状态。 表10-8 宏变量状态函数的语法与说明 ![](http://image109.360doc.com/DownloadImg/2020/10/2319/205328439_6_20201023070831335_wm)
以下是关于判断两个宏变量是否存在于global symboltables中: LIBNAME XJF "E:\MySAS\DATA";
%SYMDEL glbsubset subset; %MACRO makeds(subset); %GLOBAL glbsubset; %LET glbsubset=⊂
%* 判断在宏makeds中glbsubset和subset的状态; %PUT ******** Inside macro program; %PUT Is SUBSET a local macro variable(0=No/1=Yes): %SYMLOCAL(subset); %PUT Is SUBSET a global macro variable(0=No/1=Yes): %SYMGLOBL(subset); %PUT Is GLBSUBSET a local macro variable(0=No/1=Yes): %SYMLOCAL(glbsubset); %PUT Is GLBSUBSET a global macro variable(0=No/1=Yes): %SYMGLOBL(glbsubset); %PUT ********;
DATA BOOK; SET xjf.ytdsales(where=(section="&subset")); ATTRIB QTRSOLD label='Quarter of Sale'; QTRSOLD=qtr(DATESOLD); RUN; %MEND makeds;
%makeds(INTERNET)
%* 判断宏变量SUBSET和GLBSUBSET是否在global symbol table中?; %PUT Does SUBSET exist (0=No/1=Yes): %SYMEXIST(subset); %PUT Is SUBSET a global macro variable(0=No/1=Yes): %SYMGLOBL(subset); %PUT Is GLBSUBSET a global macro variable(0=No/1=Yes): %SYMGLOBL(glbsubset);
PROC TABULATE DATA=BOOK; TITLE "Book Sales Report Produced &sysdate9"; CLASS QTRSOLD; VAR SALEPRICE LISTPRICE; TABLES QTRSOLD ALL, (SALEPRICE LISTPRICE)*(N*F=6. SUM*F=DOLLAR12.2) / BOX="SECTION:&glbsubset"; KEYLABEL ALL='** TOTAL **'; RUN; ![](http://image109.360doc.com/DownloadImg/2020/10/2319/205328439_7_20201023070831413_wm)
图10-8 宏状态函数执行结果 表10-9列举了四个宏函数,它们可将SAS语言函数应用于宏变量或文本,还可从运行的操作系统获取信息。其中%SYSFUNC中最常用,其功能也非常强大,通过%SYSFUNC函数可调用包括SAS和SCL在内的所有内置函数。能与%SYSFUNC(%QSYSFUNC)连用的SAS函数有60多个,应用时可查看SAS HELP。 表10-9 宏引用函数的语法与说明 ![](http://image109.360doc.com/DownloadImg/2020/10/2319/205328439_8_20201023070831506_wm)
以下是宏函数%SYSFUNC应用举例: %*%SYSFUNC应用与SAS函数GETOPTION连用举例; %MACRO GETOPT(WHATOPT); %LET OPTVALUE=%SYSFUNC(GETOPTION(&WHATOPT)); %PUT OPTION &WHATOPT=&OPTVALUE; %MEND GETOPT;
%GETOPT(PS) %GETOPT(LS) %GETOPT(DATE) %GETOPT(SYMBOLGEN) %GETOPT(COMPRESS) ![](http://image109.360doc.com/DownloadImg/2020/10/2319/205328439_9_20201023070831600_wm)
图10-9 %SYSFUNC与GETOPTION函数连用的执行结果 %*%SYSFUNC与统计函数MEAN连用,并将计算结果传递给宏变量; %LET X=2.34; %LET Y=-2.33; %LET Z=8.77; %LET MEAN=%SYSFUNC(MEAN(&X,&Y,&Z)); %PUT ****** The mean of &X, &Y, and &d is &mean..; ![](http://image109.360doc.com/DownloadImg/2020/10/2319/205328439_10_20201023070831694_wm)
图10-10 %SYSFUNC与MEAN函数连用的执行结果 整理不易,欢迎点亮再看哦!
参考文献: [1] 薛富波, 张文彤, 田晓燕, 等. SAS8.2统计应用教程[M]. 北京:兵器工业出版社, 2004 [2] 夏庄坤, 徐唯 , 潘红莲, 等. 深入解析SAS——数据处理、分析优化与商业应用[M]. 北京:机械工业出版社, 2014. [3] 高惠璇. SAS系统Base SAS软件使用手册[M]. 北京:中国统计出版社, 1997. [4] 姚志勇. SAS编程与数据挖掘商业安全[M]. 北京:机械工业出版社, 2010. [5]Michele M. Burlew. SAS Macro Programming Made Easy[M]. Cary, NC: SAS InstituteInc., 2006.
|