SAS讲义 第十八课SAS宏功能简介
- 格式:doc
- 大小:86.00 KB
- 文档页数:6
第10章SAS宏功能10.1 概述SAS系统的MACRO处理器可以让程序更简洁更明了及更容易维护,帮助用户在使用SAS系统时更方便更自动化,具体来说,它具有以下功能:1.获取SAS的系统信息;2.有条件地执行数据步和过程步;3.开发交互式系统;4.在不同的数据步和过程步之间传递数据;5.重复执行SAS代码等等。
.SAS宏语言的管理1.MACRO变量2.MACRO程序语句3.MACRO表达式和函数10.2 SAS宏变量的使用与定义宏变量(有时也称符号变量)属于SAS宏语言的范畴,和数据步中的变量的概念是不一样的。
除了数据行外,你可以在SAS程序的任何地方定义和使用宏变量。
数据步变量是和数据集相联系的,而宏变量是独立于数据集的。
数据集变量的值取决于正在处理的观测,而一个宏变量的值总是不变,直到被明确改变。
宏变量类似于一般变量的命名方法。
程序中以&宏名来引用MACRO变量(有时为了清晰起见,也可以通过&宏名. 来引用MACRO变量)SAS宏变量共有两种:1.系统宏变量2.用户自定义的宏变量。
10.2.1 系统宏变量 一些系统宏变量01 /* Program_10-l-l.sas */02 DA TA _NULL_;03 PUT 'SYSDATE=' "&SYSDA TE"; /* 执行时的日期 */04 PUT 'SYSDAY='"&SYSDAY"; /* 执行时是星期几 */05 PUT 'SYSENV='"&SYSENV"; /* 交互模式或批次模式 */06 PUT 'SYSSCP='"&SYSSCP"; /* 返回正在用的操作系统 */07 PUT 'SYSJOBID = '"&SYSJOBID"; /* 程序的操作执行代码 */08 PUT 'SYSERR='"&SYSERR"; /* 程序执行的错误码 */ 09 PUT 'SYSRC='"&SYSRC";/*程序执行的回复码 */ 10 PUT 'SYSLIBRC='"&SYSLIBRC"; /* 使用LIBNAME 时设置是否正确 */11 PUT 'SYSFILRC='"&SYSFILRC"; /*使用FILENAME 时设置是否正确*/12 RUN;使用宏语句 %put _automatic_; 可以查看所有的系统宏变量,结果显示在LOG窗口。
sas宏(1)、系统宏变量、⾃定义宏变量、输出宏变量值、宏与text结合SAS macro variables 1. enable you to substitute text in your SAS programs(替代作⽤,和c++的 #define 差不多) 2. When you reference a macro variable in a SAS program, SAS replaces the reference with the text value that has been assigned to that macro variable. By substituting text into programs, SAS macro variables make your programs more reusable and dynamic 3. 判断宏变量定义的结束是以分号为分隔符。
为什么要使⽤宏变量?因为,宏能起到⼀处替换,多处替换的效果!宏变量储存在哪?The value of a macro variable is stored in a symbol table。
The values of automatic macro variables are always stored in the global symbol table(意味着你总可以引⽤到这些宏)The values of user-defined macro variables can reside either in a macro symbol table local or in the global symbol table.(⾃定义的宏变量⼤部分也储存到全局符号表中)宏变量的使⽤范围有多⼤?除了datalines步,其他任何地⽅都可以使⽤!如何删除宏?%symdel mvariable;1:宏变量如何使⽤宏变量?使⽤引号符号(&)对宏进⾏引⽤,当sas程序遇到&时,会在symbol table中搜寻同名变量,进⽽得出变量中的值。
第10章SAS宏功能10.1 概述SAS系统的MACRO处理器可以让程序更简洁更明了及更容易维护,帮助用户在使用SAS系统时更方便更自动化,具体来说,它具有以下功能:1.获取SAS的系统信息;2.有条件地执行数据步和过程步;3.开发交互式系统;4.在不同的数据步和过程步之间传递数据;5.重复执行SAS代码等等。
.SAS宏语言的管理1.MACRO变量2.MACRO程序语句3.MACRO表达式和函数10.2 SAS宏变量的使用与定义宏变量(有时也称符号变量)属于SAS宏语言的范畴,和数据步中的变量的概念是不一样的。
除了数据行外,你可以在SAS程序的任何地方定义和使用宏变量。
数据步变量是和数据集相联系的,而宏变量是独立于数据集的。
数据集变量的值取决于正在处理的观测,而一个宏变量的值总是不变,直到被明确改变。
宏变量类似于一般变量的命名方法。
程序中以&宏名来引用MACRO变量(有时为了清晰起见,也可以通过&宏名. 来引用MACRO变量)SAS宏变量共有两种:1.系统宏变量2.用户自定义的宏变量。
10.2.1 系统宏变量 一些系统宏变量01 /* Program_10-l-l.sas */02 DA TA _NULL_;03 PUT 'SYSDATE=' "&SYSDA TE"; /* 执行时的日期 */04 PUT 'SYSDAY='"&SYSDAY"; /* 执行时是星期几 */05 PUT 'SYSENV='"&SYSENV"; /* 交互模式或批次模式 */06 PUT 'SYSSCP='"&SYSSCP"; /* 返回正在用的操作系统 */07 PUT 'SYSJOBID = '"&SYSJOBID"; /* 程序的操作执行代码 */08 PUT 'SYSERR='"&SYSERR"; /* 程序执行的错误码 */ 09 PUT 'SYSRC='"&SYSRC";/*程序执行的回复码 */ 10 PUT 'SYSLIBRC='"&SYSLIBRC"; /* 使用LIBNAME 时设置是否正确 */11 PUT 'SYSFILRC='"&SYSFILRC"; /*使用FILENAME 时设置是否正确*/12 RUN;使用宏语句 %put _automatic_; 可以查看所有的系统宏变量,结果显示在LOG窗口。
SAS宏:9步法SAS宏主要包括两部分:宏变量和宏函数通过使用SAS宏,可以更加容易维护SAS代码,是程序更加灵活,动态执行。
一般来说,通过写宏函数执行代码需要9个步骤第1步:写好程序,并且确保程序能够正确运行proc means data=expenses mean;var RoomRate;run;proc print data=expenses;title 'Lowest Priced Hotels in theEXPENSES Data Set';footnote 'On June 1, 2003';var ResortName RoomRate Food;where RoomRate<=221.109;run;宏功能使程序每次能够自动根据数据集的变化进行改变第2 步:使用宏变量帮助文本替换宏变量提供文本替换,这样可以使用简单的单词或者词组,不需要大段的代码。
宏变量包括:自动宏变量,用户自定义宏变量%let,在数据步或者sql过程步使用的用户自定义宏变量call symput。
不管是如何创建宏变量,在程序中引用宏变量通过&。
options symbolgen;%let dsn=expenses;%let varlist=ResortName RoomRate Food;proc means data=&dsn mean;var RoomRate;run;%let average=221.109;proc print data=&dsn;title "Lowest Priced Hotels in the &dsnData Set";footnote "On &sysdate9";var &varlist;where RoomRate<=&average;run;SYMBOLGEN在日志窗口中记录宏变量是如何解析的。
第十八课SAS宏功能简介* SAS系统提供了强大的宏功能(macro facility),通过创建宏变量和宏能方便地完成:●重复分析任务,大大精减了程序量●从系统获取一些如SAS启动时间、日期、版本号等信息●有条件地执行数据步和过程步●保持程序的对立性和移植性,产生与数据无关的程序●用宏变量在不同数据步和过程步之间传递数据一.SAS宏变量宏变量(也称符号变量)属于SAS宏语言的范畴,和数据步中的变量概念是不一样的。
除了数据行外,可以在SAS程序的任何地方定义和使用宏变量。
数据步变量是和数据集相联系的,而宏变量是独立于数据集的。
数据集变量的值取决于正在处理的观测,而一个宏变量的值总是保持不变,直到被明确改变。
1宏变量的定义定义一个宏变量的最简单方法是使用宏语句%LET,它的一般形式如下:%LET宏变量名=值;宏变量的命名遵从一般的SAS命名规则。
宏变量的值不需要加引号,如果值加入引号,则引号被作为宏变量值的一部分。
宏变量的值可以是固定的字符串、其它宏变量的引用、宏函数和宏调用。
2宏变量的引用为了引用一个宏变量的值,在宏变量前加上一个符号&,格式如下:&宏变量名宏变量被引用的效果就是用宏变量的内容直接替代宏变量名。
3宏变量的使用举例例如,我们想要打印、图示和分析几个数据集,但又希望避免重复键入每一个数据集名字以修改相同的程序代码。
解决方法是用%LET语句创建一个宏变量DSNAME,该宏变量赋值了一个数据集名SURVEY。
然后这个宏变量在PROC PRINT等许多过程和TITLE语句中被引用。
程序如下:%Let dsname=survey ;Proc print data=&dsname ;Var name sex bdate income ;Title “Display of Data Set &dsname” ;Run ;要注意标题语句Title平时既可以用单引号又可以用双引号围住标题,但如果有宏变量引用,则必须用双引号,否则用单引号将当作字符串处理。
上面的程序中,我们只要修改宏变量dsname的赋值,就能对多个数据集执行相同的打印输出等操作。
可用几个%LET语句来创建多个宏变量进一步增强过程的通用性。
例如,我们可用WHERE语句来规定用作打印和分析的一个范围。
如用%LET语句把宏变量START和END 分别定义为开始和结束的日期。
程序如下:%Let dsname=survey ;%Let start=’01jan79’d ;%Let end= ‘31dec80’d ;Proc print data=&dsname ;Var name sex bdate income ;Where &start<bdate<&end ;Format bdate date7. ;Title “Display of Data Set &dsname” ;Run ;这样,通过适当的%LET语句来简单改变起始和结束日期,就能替代在WHERE语句中的多处改动。
提请大家注意宏变量赋值日期常数’01jan79’d的这种格式,也可以直接赋日期存储值,如改成%Let start=6940和%Let end=7670。
二.自动宏变量SAS的宏变量共有两种:一是用户定义的宏变量,如我们上面所定义宏变量dsname、start、end。
二是自动宏变量,由SAS系统定义。
自动宏变量是在系统启动时就已经被创建,在SAS系统退出前一直保持有效,能够在SAS 系统的任何地方被引用。
下表列出一些用户常用的自动宏变量:自动宏变量作用值SYSDATE 本次SAS启动的日期如04AUG97SYSDAY 本次SAS启动的星期如MondaySYSTIME 本次SAS启动的时间如11:18SYSLAST 最新创建的数据集名字如STUDY.SURVEYSYSDSN 最新创建的数据集两部分名字如STUDY SURVEYSYSVER 使用SAS软件的版本如6.12SYSSCP 返回用户主机系统的缩写如WIN例如,我们修改上面的程序,增加一个小标题,在小标题中引用自动宏变量,程序如下:%Let dsname=survey ;%Let start=’01jan79’d ;%Let end= ‘31dec80’d ;%Let analyst= Zuxin.Deng ;Proc print data=&dsname ;Var name sex bdate income ;Where &start<bdate<&end ;Format bdate date7. ;Title “Display of Data Set &dsname” ;Title2 “&systime &sysday , &sysdate by &analyst” ;Run ;三.创建一个宏宏是一个被存储的文本,用一个名字识别它。
最简单的宏就像一个宏变量一样工作,但复杂的宏可以包括分支和循环等结构,能实现许多宏变量不能实现的功能。
1宏的定义和调用宏定义的一般形式如下:%MACRO 宏名字(参数宏变量);宏实体;%MEND 宏名字;%MACRO语句是每一个宏的开始,同时必须给出这个宏的名字。
宏实体可为任一个文本,SAS语句或SAS步,宏变量、函数和这些实体的组合。
%MEND语句必须围住每个宏并表示宏结束。
参数宏变量是一些将要传递给宏调用的宏变量,不同参数宏变量之间用逗号隔开。
SAS程序中可以包括任意多个宏,且在程序中可以多次调用一个宏。
在SAS中引用宏调用的形式如下:%宏名字(参数值);例如,我们定义了一个简单通用的宏程序INVOKE,它有两个参数宏变量procname和dsname,用以传递给宏程序所需的过程名和数据集名。
在调用这个宏程序时要将具体的参数宏变量值给出,其值分别为Print和Study.Survey。
程序如下:%MACRO INVOKE(procname,dsname);Proc&procname Data=&dsnmae ;Title“&procname of Data Set &dsname” ;Run ;%MEND INVOKE ;%INVOKE(Print , Study.survey) ;上面这段程序在执行时,将被宏处理器替换成下面这段程序:Proc Print Data=Study.survey ;Title“Print of Data Set Study.survey” ;Run ;2具有分支和循环的宏与SAS系统DATA步和PROC步中可以使用分支和循环语句一样,也能在%MACRO 和%MEND语句间,用条件%IF—%THEN/%ELSE语句和用循环%DO —%END、%DO %UNTIL—%END、%DO %WHILE—%END语句来产生更复杂的宏。
虽然分支和循环的语句格式两者不相同,但两者的使用原理和方法却是相同的。
通常SAS宏程序比一般的SAS语言程序要更难理解,主要的难点是宏程序中宏变量的传递和控制。
例如,假设我们已有两个宏CREATE和PRINT,宏CREATE可以从参数宏变量SETDATA1指定的数据集中创建一个新的数据集STUDY.TEMP,宏PRINT可以打印一个参数宏变量SETDATA2指定的数据集。
现在我们要定义一个控制宏CONTROL,假定有时需要对指定的数据集先运行宏CREATE,创建一个新的数据集STUDY.TEMP后,再调用宏CREATE打印这个新产生的数据集;有时却只要直接打印指定的数据集。
那么,我们可以用一个%IF —%THEN语句来定义宏CONTROL。
程序如下:%Macro create(setname1) ;Data study.temp ;Set&setname1;If sex='M';%Let dsname=study.temp;Run ;%Mend create ;%Macro print(setname2) ;Proc print data=&setname2 ;Title"Display of Data Set &setname2 " ;Run ;%Mend print;%Macro control(getdata,dsname) ;%If %upcase(&getdata)=YES %Then %create(&dsname) ;%print(&dsname) ;%Mend control ;%control(no, study.survey) ;%control(yes,study.survey) ;当规定参数宏变量getdata的值为大写字符串YES或小写字符串yes时,%IF条件成立,宏处理器执行%THEN的分句,即调用宏%create(&dsname)。
宏函数%upcase的作用是转化小写文本为大写,因此当getdata的值为小写字符串yes时,%IF条件也成立。
在调用宏%create 时要给出参数宏变量setname1的值,使用宏变量&dsname中的值,其值为字符串study.survey。
当规定参数宏变量getdata的值为字符串YES或yes以外的任何值时,%IF条件不成立,执行调用宏%print(&dsname)。
提请注意的是,即使%IF条件成立,执行完%THEN分句后,也同样要执行调用宏%print(&dsname),但打印的数据集不同。
因此调用宏%print(setname2) 执行时,参数宏变量setname2中的值有两种可能:当%IF 条件成立,执行完宏%create后,再执行宏%print(setname2) 时,setname2中的值应该为study.temp;当%IF条件不成立,直接执行宏%print(setname2) 时,setname2中的值应该为study.survey。
正因为有如此要求,所以要在宏%create中增加一条%Let dsname=study.temp 语句,只要执行了宏%create就修改宏变量dsname的值为新建数据集名study.temp。
下面我们举一个宏循环语句的使用例子。
假定用户想生成一系列变量名字用于某个SAS 语句,如用在DATA、VAR和TITLE语句中。
可以定义一个宏names来产生具有相同前缀的一系列变量名字。
我们可采用重复%DO循环语句来实现。
程序如下:%MACRO names(varname,number);%Do n=1 %to &number ;&varname &n%Run;%MEND names ;Proc print data=study.class ;Var name%names(Test,3) ;Title“%names(Test,3) generated by macro variable”;Run ;在数据集STUDY.CLASS中,有一组相同前缀TEST不同1、2和3数字组成的字段变量名。