12. SAS宏简介
- 格式:ppt
- 大小:297.50 KB
- 文档页数:32
第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窗口。
第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(Statistical Analysis System)中,macro是一种非常重要的功能,可以帮助用户简化重复性的工作、提高代码的重用性、减少代码的维护成本,并且能够增加代码的灵活性和可读性。
在SAS中,我们可以将编写好的macro存储起来,并在需要的时候调用它们,这为SAS编程带来了极大的便利和效率提升。
在本篇文章中,我们将深入探讨SAS中macro的存储与调用的相关内容,以及它们在实际工作中的应用价值。
通过逐步介绍,你将对这一主题有个全面、深刻和灵活的理解。
1. 存储macro:在SAS中,我们可以将编写好的macro存储起来以备后用。
存储macro有两种常见的方式:一种是将macro存储在一个独立的文件中,然后在需要的时候通过%include语句引入;另一种方式是将macro直接存储在SAS数据集中。
将macro存储在独立文件中的好处是可以方便地进行版本管理和共享,而将macro存储在数据集中则可以更好地与数据进行整合和同步。
2. 调用macro:一旦macro被存储起来,我们就可以在需要的时候调用它们。
在SAS 中,我们可以使用%macro和%mend语句来定义一个macro,并在需要的时候使用%macro_name的方式进行调用。
通过调用存储的macro,我们可以大大减少重复编写相似代码的工作量,提高代码的重用性和可维护性。
3. 应用案例:在实际工作中,存储和调用macro能够极大地提高我们的工作效率。
在数据清洗和数据分析过程中,我们经常会遇到一些重复性的操作,比如计算变量、生成报表等。
通过编写和存储相应的macro,我们可以在需要的时候轻松调用它们,从而大大减少重复编写代码的时间,提高工作效率。
4. 个人观点:对于SAS中macro的存储与调用,我个人认为是一个非常实用的功能。
通过将常用的操作存储为macro,并在需要的时候进行调用,不仅能够提高工作效率,还能够减少错误和提高代码的可读性。
sas宏(2),运⾏中创建宏与使⽤宏,多个宏触发器的引⽤规则、procsql创建宏,scl。
1:在程序运⾏中进⾏宏定义CALL routines that enable you to transfer information between an executing DATA step and the macro processor.You can use the SYMPUT routine to create a macro variable and to assign to that variable any value that is available in the DATA step.When you use the SYMPUT routine to create a macro variable in a DATA step, the macro variable is not actually created and assigned a value until the DATA step is executed.options symbolgen pagesize=30;%let crsnum=3;data revenue;set sasuser.all end=final;where course_number=&crsnum;total+1;if paid='Y'then paidup+1;if final then do;if paidup<total then do;call symput('foot','Some Fees Are Unpaid'); /*symput函数能达到运⾏时给宏赋值的效果*//*%let foot=Some Fees Are Unpaid; */ /*使⽤let不能达到想要的效果,let会被宏处理器先执⾏,优先于data步*/end;else do;call symput('foot','All Students Have Paid');/*%let foot=All Students Have Paid;*/end;end;run;symput函数⾥⾯的参数为表达式的情况⾥⾯引⽤的函数不需要使⽤%这种宏函数的记号trim去右尾 left去左尾call symput('numpaid',trim(left(paidup)));CALL SYMPUTX(macro-variable, value <,symbol-table> );默认去双尾空⽩,其他效果和symput⼀样随后⼀个参数表⽰宏储存的位置'L'=local 'G'=globalThe SYMPUT routine and the SYMPUTX routine can only create a local macro variable if a local symbol table already exists. If no local symbol table exists when the SYMPUT routine or SYMPUTX routine executes, it will create a global macro variable.依据变量名建⽴宏data _null_;set sasuser.courses;call symput(course_code, trim(course_title));/*每⼀个observation中的两个变量分别对于宏值与宏变量*/run;%put _user_;多个宏触发器的扫描规则宏处理器将两个&当做⼀个看待,所以第⼀次扫描&&&lv2被处理成&(&lv2)->&lv1,第⼆次扫描就得出res,先将重复的两个变成1个,然后记住扫描的位置,继续扫⾯后⾯的。