12.-SAS宏简介

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Slide1SAS宏简介Slide2主要内容:1.概述2.宏变量3.宏4.宏参数5.宏内流程控制结构6.宏与数据步的信息交换7.宏语句与宏函数Slide31.概述SAS宏工具是SAS系统的重要编程工具,功能强大可以给一个变量、一段程序、一段文本命名,供以后调用是编制用户化的SAS系统的重要工具使用宏工具来完成以下任务:执行重复性任务使用宏变量实现文本替代使用宏产生程序语句使用宏循环及条件判断语句完成程序交互Slide42.宏变量宏变量是SAS宏语言中用于存储一段字符串的SAS命名宏变量的主要用途是进行SAS文本替代SAS宏变量分类用户定义宏变量用户根据自己需要定义的宏变量自动宏变量:SAS系统提供的可以引用的宏变量Slide51)自定义宏变量自定义宏变量格式,使用%let语句%LET宏变量名=宏变量值;例如:%lethello=Thisismyfirstmacrovariable;%letDSN=SASHELP.CLASS;%letk=1;Slide62)引用宏变量引用宏变量的方式:在宏变量名前使用&&宏变量名例如,注意:只有在双引号中,宏变量才能被引用;单引号不会引用!title我的标题:&hello;procprintdata=&DSN;run;Slide7等价的SAS数据步程序title我的标题:Thisismyfirstmacrovariable;procprintdata=SASHELP.CLASS;run;实质上,SAS在运行时,将宏变量的值替代到了相应的位置上即,&hello换成了Thisismyfirstmacrovariable&DSN换成了SASHELP.CLASSSlide8多次引用宏变量title我的标题:&HELLO;title2打印的数据集是&DSN;PROCPRINTDATA=&DSN;RUN;;DATAA;SET&DSN;IFSEX=M;RUN;PROCPRINTDATA=A;RUN;三次引用宏变量DSNSlide9定义宏变量的值为一段程序格式:%let宏变量名=%str(一段程序);例如%letprt=%str(PROCPRINT;RUN;);引用&prt产生的作用:PROCPRINT;RUN;Slide103)显示宏变量及宏变量的值:%put显示宏变量%put_user_;显示用户定义的宏变量%put_automatic_;显示系统提供的自动宏变量%put_all_;显示所有宏变量显示指定宏变量的值%put&宏变量名;例如%put&hello;%put&dsn;%putthisismytest:&dsn;Slide114)宏变量与后续文本的分隔当宏变量跟后续文本紧密同时使用时,需要界定宏变量的结束位置例如title1“&hello1第一个程序”;title2“&hello2第二个程序”;此时,SAS会认为宏变量名为hello1和hello2,而实际上宏变量为hello解决办法:在宏变量结束的地方加一个英文句号(.),如下title1“&hello.1第一个程序”;title2“&hello.2第二个程序”;Slide125)间接引用宏变量“&宏变量名”来引用宏的方式是直接引用如果引用的宏变量名是通过宏产生的,则需要间接引用,此时需要用:&&例如,有三个宏变量:data1,data2,data3,只是末尾数字不同。采用下列方式引用时,需用间接引用方式。%letdata1=x;%letdata2=y;%letdata3=z;%leti=1;%put&&data&i;/*&data&i不能用*/%leti=2;%put&&data&i;/*&data&i不能用*/Slide133.宏概念:宏是被存储的文本,用一个名字识别它,可以从SAS程序中调用执行宏的定义%macro宏名称;/*表示宏定义的开始*/宏文本/*宏的主体部分*/%mend宏名称;/*宏定义的结束*/Slide14例子,宏的定义上面例子定义一个宏:myprint,其功能为打印最近建立的SAS数据集;宏定义语句提交运行后,SAS只是编译这段程序,如果有错,则会在log窗口提示;如果没有错误,则将编辑之后的宏存储到work.sasmacr目录中(默认),但不会执行宏&SYSLAST表示系统最近生成的一个数据集%macromyprint;procprintdata=&syslast;run;%mend;Slide15宏的调用调用宏的格式,使用%%宏名称例如,调用上面建立的宏myprint%myprint其作用就是执行下面SAS程序procprint;run;Slide164.宏参数定义:%macro宏名称(参数1,参数2,….);宏文本%mend;说明:其中参数列是逗号分开的参数名,参数列中提到的参数在宏文本中作为宏变量引用引用:%宏名称(参数1,参数2,….)说明:每个参数值将赋予宏定义中相应位置的参数。Slide17例如,宏参数的定义与调用说明:参数与参数之间以逗号分隔,引用时,第二个参数varlist的值为:namesex。/*定义*/%macromyprint(dataset,varlist);procprintdata=&dataset;var&varlist;run;%mend;/*引用,指定参数*/%myprint(sashelp.class,namesex)Slide18关键字参数的定义与调用说明:引用时,关键字参数不受位置的限制。该宏默认时打印最后建立的数据集中的所有数值型变量/*定义*/%macromyprint(dataset=&syslast,varlist=_numeric_);procprintdata=&dataset;var&varlist;run;%mend;/*引用,指定参数*/%myprint(datasex=sashelp.class,varlist=namesex)在命名和调用时用等号(=)指定参数名称的参数为关键字参数,此时可以给参数赋初值Slide195.宏内流程控制结构宏do循环语句条件判断语句Slide201)宏DO循环语句计数型循环:%Do循环变量=初值%to终值[%By步长];循环体;%End;注:循环变量是一个宏变量需要在宏定义的内部使用Slide21例子,宏DO循环%macrotest;%doi=1%to5;%putthisisatestforDO:&i;%end;%mend;/*调用*/%testLOG窗口输出结果:thisisatestforDO:1thisisatestforDO:2thisisatestforDO:3thisisatestforDO:4thisisatestforDO:5Slide22生成重复文本%macrodsn(name,num);%doi=1%to#&name&i%end;%mend;在DATA语句中调用宏dsn:data%dsn(AB,5);run;产生下列data步语句:DATAAB1AB2AB3AB4AB5;Slide231)宏do循环语句直到型循环%Do%Until(表达式);循环体;%End;当型循环%Do%While(表达式);循环体;%End;注:当型循环和直到型循环需自己设置一个宏变量作为循环变量,对循环变量累加赋值时需使用函数%eval()来计算算术表达式的值Slide24例子,%DO%WHILE%macrotest2;%leti=1;%do%while(&i10);%putthisisatestforDOWHILE:&i;%leti=%eval(&i+1);/*函数%eval()将整数值宏文本转换成数值进行算术运算*//*函数%sysevalf()将带小数的文本转换成数值进行算术运算*/%end;%mend;/*调用宏*/%test2Slide252)条件判断语句格式:%If表达式%THEN语句1;%ELSE语句2;或复合语句%If表达式%THEN%DO;语句组;%END;%ELSE%DO;语句组;%END;Slide26例子,根据输入选择性输出%macrotest3(Res=Y);%if&Res=Y%then%putYes,youareright!;%else%putNo,youarewrong!;%mend;%test3(res=n)%macrotest4(Num=Y,dsn=sashelp.class);procprintdata=&dsn;%if&Num=Y%then%do;var_numeric_;%end;%else%do;var_all_;%end;run;%mend;%test4(Num=Y)根据Num的值判断输出Y:输出全部数值变量其它,输出所有变量Slide276.宏与数据步的信息交换常用的两个子程序或函数子程序说明SYMPUT子程序在数据步中,将变量的值传给宏变量使用语法:Callsymput(‘宏变量名’,变量名);SYMGET函数在数据步中,获取宏变量的值使用语法:Y=symget(‘宏变量名’);Slide28例子,创建宏变量mynum,取值为36在数据步中,通过symget()函数获取宏变量的值,赋给变量Y在数据步中,通过symput()子过程创建宏变量px,将变量x的值赋给宏变量%letmynum=36;dataa;inputx@@;callsymput('px',x);y=symget('mynum');cards;1234;run;Slide29例子,将数据集观测总数赋给宏变量Total用数据步计算1到Total之间的自然数之和,赋给宏变量Ntotal,用%put语句显示宏变量Ntotal的值data_null_;setsashelp.classnobs=i;callsymput('Total',i);run;data_null_;t=symget('Total');doi=1tot;k+i;end;callsymput('Ntotal',k);run;%putNtotal=&Ntotal;Slide30宏函数宏功能包括很多宏程序语句和宏函数,下面列出几个函数名说明%Eval计算算术和逻辑表达式整数格式%SYSEVALF计算算术和逻辑表达式浮点格式%SYSFUNC调用数据步函数,功能强大%SYSFUNC(数据步函数(参数),输出格式)Slide31例如,宏变量计算Log窗口显示的结果为:y=300z=100+200112.3511-25-2015浮点计算需要用%sysevalf函数%sysfunc函数调用数据步函数today(),获取当前日期%letx=100;%lety=%eval(&x+200);%letz=&x+200;%puty=&yz=&z;%put%sysevalf(&x+12.35);%put%sysfunc(today(),mmddyy10.);Slide32谢谢

1 / 32
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功