收藏 分享(赏)

SAS宏入门.ppt

上传人:weiwoduzun 文档编号:5424925 上传时间:2019-03-01 格式:PPT 页数:68 大小:329.01KB
下载 相关 举报
SAS宏入门.ppt_第1页
第1页 / 共68页
SAS宏入门.ppt_第2页
第2页 / 共68页
SAS宏入门.ppt_第3页
第3页 / 共68页
SAS宏入门.ppt_第4页
第4页 / 共68页
SAS宏入门.ppt_第5页
第5页 / 共68页
点击查看更多>>
资源描述

1、SAS宏入门,SAS宏的作用,获取SAS系统信息 有条件执行数据步和过程步 开发交互式系统 产生与数据无关的SAS程序 在不同的SAS数据步和过程步之间传递数据 重复执行SAS程序,简介:,定义:可以按照用户的需要对SAS系统进行扩充和定义,以减轻在完成一些相同的统计分析任务时的文本录入量。宏功能包括: 宏处理器宏语言两种定义符:&名字(宏变量标记)%名字(一段宏),简介:,对SAS程序书写的约定:用户录入的程序用小写字母,SAS系统看到的程序用大写字母,其中宏变量替代的部分用黑体字表示。注意:有三个以%开头的SAS语句不是宏功能中的内容,它们是%INDUCE、%LIST、%RUN语句。,主要

2、内容:,1、宏变量 2、宏 3、宏应用实例 4、如何提高宏的运行效率,一、宏变量,1、1 简介:,宏变量:SAS程序中通过替代符号动态地更改文本的工具;只包含字符型数据。具体长度是由赋值给它的文本决定的。值的最大长度为:32K字符分类:用户定义的宏变量自动宏变量全局宏变量局部宏变量,1、2 SAS系统定义的宏变量,除了SYSPBUFF之外,所有的自动宏变量都是全局变量。 要使用自动宏变量,可以在 用户可以给具有读/写状态的自动宏变量赋值,但不能给只读状态的宏变量赋值。 使用% PUT_ AUTOMATIC_,可以看到所有可以利用的自动宏变量。,表221 按类别划分的自动宏变量,状 态,变 量,

3、内 容,读写,SYSBUFFER 来自于%INPUT的不匹配的文本,SYSCC SAS对用户的操作环境返回的当前状态代码,YSCMD 来自于宏窗口命令行的最后一个不可识别的命令,SYSDEVIC 当前图形设备的名字,SYSDMG 反映对一个损坏的数据集采取的措施的返回代码,SYSDSN 最近使用的SAS数据集的两级名称,SYSFILRC FILENAME 语句设置的返回代码,SYSLAST 最近使用的SAS数据集的名称,SYSLCKRC LOCK语句设置的返回代码,SYSLIBRC LIBNAME语句设置的返回代码,SYSMSG 宏窗口显示的信息,SYSPARM SYSPARM系统选择项设定的

4、值,SYSPUBFF 宏参数值的文本,SYSRC 各种与系统有关的返回代码,表221 按类别划分的自动宏变量(续表),状 态,变 量,内 容,只读,SYSCHARWIDTH 字符串宽度值,SYSDATE 表示当前SAS工作或运行期间日期的字符串(两年数份),SYSDATE9 表示当前SAS工作或运行期间日期的字符串值(两年数份),SYSDAY SAS 工作或运行期间的星期几,SYSENV 前景或背景荧光屏指示符,SYSERR SAS 过程或数据步设置的返回代码,SYSINDEX 目前工作期间已经执行的宏数,SYSINFO 返回代码信息,SYSJOBID 目前一批工作或用户ID的名称(随主机环境

5、改变),SYSMENV 当前宏运行的环境,SYSPROCESSID 当前SAS操作的ID,SYSPROCESSNAME 当前SAS操作的名称,SYSSCP 操作系统的缩写,SYSSCPL 操作系统的名称,STSSITE 分配给用户的地点的号码,SYSSTARTID 最后一个STARTSAS语句产生的ID,表221 按类别划分的自动宏变量(续表),状 态,变 量,内 容,SYSSTARTNAME 最后一个STARTSAS 语句产生的操作名称,SYSTIME 当前SAS工作或运行期间时间的字符串值,SYSUSERID 当前SAS操作的用户ID或注册号,SYSVER 所运行的SAS的版本号,SYSV

6、LONG SAS软件的版本号和维护等级,1、3 用户定义的宏变量(1),定义宏变量方法: 宏变量名必须以字母和下划线开始,后面跟字母或数字。 可以给任意宏变量命名,只要这个名称不是保留字(见表22、2)。 建议不要使用AF、DMS、SQL、SYS等前缀,因为SAS软件常常把他们用在自动宏变量中。可以使用%PUT_ ALL_查看到所有用户创建的宏变量。,表222 宏功能中的保留字,ABEND END METASYM SUBSTR,ABORT EVAL NRBQUOTE SUPERQ,ACT FILE NRQUOTE SYSCALL,ACTIVATE GLOBAL NRSTR SYSEVALF,B

7、QUOTE GO ON SYSEXEC,BY GOTO OPEN SYSFUNC,CLEAR IF PAUSE SYSGET,CLOSE INC PUT SYSRPUT,CMS INCLUDE QSCAN THAN,COMANDR INDEX QSUBST TO,COPY INFILE QUOTE TSO,DEACT INPUT QSYSFUNC UNQUOTE,DEL KEYDEF QUPCASE UNSTR,DELETE LENGTH RESOLVE UNTIL,DISPLAY LET RETURN UPCASE,DMIDSPLY LIST RUN WHILE,DMISPLIT LISTM

8、 SAVE WINDOW,DO LOCAL SCAN,ELSE MEND STR,EDIT MACRO STOP,可以使用PUTALL查看到所有用户创建的宏变量。,1、3 用户定义的宏变量(2) 1、创建宏变量及对其赋值,最简单方法:使用宏程序语句%LET,其形式为:%LET宏变量名=宏变量值 其他:%DO循环语句;%GLOBAL语句;%INPUT语句;SQL中的SELECT语句的INTO语句;%LOCAL语句;%MACRO语句;SCL中的SYMPUT程序和SYMPUTN程序;%WINDOW语句。,1、3 用户定义的宏变量(3) 2、引用宏变量:,在创建了一个宏变量之后,使用它的方法是在它的名

9、字前加一个与符号(&变量名),这称为宏变量引用 (macro variable reference),这一引用通过对宏变量值的解析产生符号替代。要解析一个文本串中的宏变量引用,要把这个文本串用引号括起来,单引号的宏变量引用不被解析。比较下面两个TITLE语句的区别:let city=shanghaititle 1:“Data of &city”;title 2: Data of &city;SAS 系统最后显示的标题分别是:Data of shanghai和Data of &city, 用户可以根据需要在SAS程序中多次引用宏变量,宏变量,宏变量的值保持不变,直到用户改变它,例如:,%let

10、mmm=Newcity;Data temp;If num=800;run;proc print;title “Subset of Data Set &mmm”;run;, 每次出现宏变量引用&MMM,宏处理器用Newcity 替代 它,所以SAS看到的语句是:,DATA TEMP;SET NEWCITY;IF NUM =800;RUN;PROC PRINT;TITLE “Subset of Data Set Newcity”;RUN;,注意:如果引用了有存在的宏变量,在SAS的log窗口会显示警告信息。, 有时需要将宏变量引用和前导文本或末尾文本合并起来(例 如:DATA=PERSNL&YRE

11、MPLOYES,其中&YR包括了两位数的年份值)或和另一个宏变量引用合并起来(例如&MONTH&YR),这样可以使用户在几个地方使用相同的文本或反复使用一段程序,因为我们可以改变每一次的值。例如:,%let mmm=bought;data new&mmm;set save. &mmm;more SAS statementsif num1000;run;,SAS 看到的语句是:DATA MEWBOUGHT;SET SAVEBOUGHT;more SAS statementsIF NUM1000;RUN; 注意:宏变量引用不需要连接操作符,SAS系统会自动构造结果字符,这与数据步不一样。, 有时我

12、们要在文本中对宏变量定界, 看下面一段语句:%let mmm=bought;data &mmm1 &mmm2;set in&mmm.temp;run; 这时SAS并不会使用BOUGHT1和BOUGHT2两个数据 集,而且给出错误信息。这是因为SAS把MMM1和 MMM2当成了两个合法的宏变量名,而不是引用宏变量MMM。在这种情况下,我们要使用宏变量引用定界“”,上面第二条语句正确的写法应该是:,data &mmm.1 &mmm.2;这时的SAS看到的语句是:DATA BOUGHT1 BOUGHT2;如果“”是SAS 的名字的一部分,要使用两个定界符,如下面两级数据集名的例子:set in&mm

13、mTemp;这时SAS 看到的语句是:SET INBOUGHTTEMP;,注意:用户可以在任何宏变量引用后使用定界符,但只 有在起界定作用或“”是SAS的名字的一部分 时,定 界符才被解析,所以,下面两名语句在SAS来是等价的:title “&MMMreport”;title “&MMMreport”;它们都相当于:TITLE “bought”;,1、3 用户定义的宏变量(4) 3、显示宏变量的值, 显示宏变量的值最简单的方法是使用PUT语句,它将在SAS的log窗口显示结果,如:%let x=name;%let y=weight;%let z=height;%put &x * &y* &z*

14、;log 窗口会显示下列文本:name * weight* height*, 系统选择SYSBOLGEN 会显示对宏变量的解析。例如,宏变量PRGM和SITE的值分别为PRINTSASUSERROOM:options sysbolgen;%let title=“%upcasw(&prgm) of %upcase(&site)”;在上面语句中,SYSBOLGEN选择项会在log窗口显示:SYMBOLGEN:Macro variable PRGM resolves to print;SYMBOLGEN: Macro viaable SITE resolves to saauserroom,1、3

15、用户定义的宏变量(5) 4、改变宏变量的值,如果想在SAS程序中改变宏变量的值,只要在该宏变量值改变之前的语句中使用LET语句对其重新赋值即可,例如下面这段程序:let a =data1; %let a=data 2;data temp; data temp;set &a ; set &a;if sex=1 ; if sex=1;run; run;proc print ; proc print;title “Subset of Data Set &a”; title”Subset of Data Set &a”;run; run;,SAS 系统看到的程序为:,DATA TEMP;SET DAT

16、A1;IF SEX1;RUN;PROC PRINT;TITLE“SUBSET OF DATA SET DATA1“RUN;DATA TEMP;SET DATA2;IF SEX1;RUN;PROC PRINT;TITLE “SUBSET OF DATA SET DATA2“RUN;,1、3 用户定义的宏变量(6) 5、间接引用宏变量,比较: %put &city &n %put &city &n,原则:宏处理器从左到右把每两个, 使用间接引用引起可以通过一个DO循环语句产生一系列宏变量引用,例如宏变量CITY1至CITY10包含的值为ShanghaiBeijing Guanzhou、Tianji

17、n、Chongqing、Chengdu、Wuhan Kunming、Dalian和Nanjing,则下面的程序:%macro listthem;%do n=1 %to 10;&city&n%end;%mend listthem;%put %listthem;,会在SAS的log窗口显示:,Shanghai Beijing Guangzhou Tianjin Chongqing ChengduWuhan Kuming Dalian Nanjing, 虽然使用两个以上的&比较罕见,但是用户应该记信住这样一条原则:宏处理器从左到右把每两个&解析成一个&,然后解析后面的内容,最后再返回来解析整个宏变量

18、引用,例如下面一段语句:%let var=city;%let n=6;%put &var&n;,在第三句中,&被解析成&,&VAR被解析成CITY,&N被解 成千上万,这样&VAR&N就解析成&CITY6。最后,SAS显示 的是宏变量CITY6的值,即Chendu,至此整个解析过程结束。,1、3 用户定义的宏变量(7) 6、用宏函数对宏变量进行操作, 在定义宏变量时,用户可以在表达式中使用宏函数,然后将函数值赋给宏变量,例如:let site=2010 EXPO Shanghai;%let road=%scan(&site,2); 在第一个表达式中,宏变量SITE被赋值为字符串2010 EXP

19、O Shanghai,在第二个表达式中,SCAN 函数首先在宏变量SITE中查找第二个单词,为EXPO,然后将EXPO赋值给宏变量RODA。,二、宏,2、1 宏简介(1),定义:是一段编译好的程序,可以在提交SAS程序或SAS命令行中调用。功能:产生文本包含程序语句,控制何时如何产生文本接受参数,产生用于多处的通用的宏,2、1 宏简介(2),编辑宏时,用户必须定义一个宏,通常的形式为: %MACRO %MEND 宏名在SAS中是唯一的,作为一个宏的标志。 宏文本是宏语句、宏调用、文本表达式或恒定文本的组合。,2.1 宏简介(3),调用宏时,使用以下形式:%宏名注:对于简单的文本说明,使用宏变量

20、比定义一个宏更有效;但在复杂的任务中,宏比宏变量更有优势。,2.2 宏语言中的元素,A、语句 B、函数 C、自动宏变量,A、宏语句-1,作用:用于指示宏处理器执行一项操作,包括一些关键字、特殊的字符和操作符,以分号结束。两类:用于宏定义内和开放代码的宏语句只能用于宏定义内的宏语句,A、宏语句-2,用于宏定义内和开放代码的宏语句 %*注释 %DISPLAY %GLOBAL %INPUT %KEYDEF %LET %MACRO %PUT %SYSCALL %SYSEXEC %SYSLPUT %SYSRPUT %WINDOW,只能用于宏定义内的宏语句 %DO %DO,重复 %DO % UNTIL %

21、DO % WHILE %END %GOTO %IF- %THEN %ELSE %label %LOCAL %MEND,B、宏函数,作用:处理一个或多个参数产生相应的结果,用户可以在宏定义和开放代码内使用宏函数。分类:引用函数字符函数数值函数,C、自动宏变量,见第一节,2.3 包含SAS程序的宏,在编制包含SAS程序的宏时,首先用户要根据自己需要编制好SAS程序,然后将其定义在宏中,如下面绘制散点图的宏:macro plot;proc plot;plot height*weight;run;%mend plot;,2.4 宏参数,宏参数:即%MACRO语句中宏名后括号中的宏变量。 如:%macr

22、o plot (x, y);proc plot;plot run%mend plot,在调用左边这段宏时,要给出各个参数的值,如%plot (height, weight)SAS看到的语句是:PROC PLOT;PLOT HEIGHT*WEIGHT;RUN;,2.5 宏表达式,三种:A、文本表达式B、逻辑表达式C、算术表达式宏处理器首先对A进行解析,再计算B或C值。,A、文本表达式,定义:是任何文本、宏变量、宏函数或宏调用的组合,通常产生文本。常见的有:& BEGIN% GETLINE & PREFIX. PART & SUFFIX% UPCASE (&ANSWER),B、逻辑表达式 OR算术

23、表达式: 是一些操作符和算子构成的序列以产生一个结果。,算术表达式包括一个算术操作符,如: 1+2 4*3 4/2 00FFx-003Ax,逻辑表达式包括一个逻辑操作符,如: &DAY=FRIDAY Aa 1&INDEX &START NE &END,在以后调用这个宏时,用plot就可以,如:data temp;set lab.health;if sex=1;run;%plotproc print;run;,SAS 看到的语句是:,DATA TEMP;SET LABHEALTH;RUN;PROC PLOT;PLOT HEIGHTWEIGHT;RUN;PROC PRINT;RUN;,如果想改变宏

24、内SAS程序的值,可以在SAS程序中引入宏变量,然后在调用这个宏之前用LET语句对这语句中的宏变量赋值,例如:,%macro plot;proc plot;Plot &X*&y;Run;data temp;Set data1;If sex=1;run;,%let x=height; %let y=weight; %plot %let x=age; %plot Proc print; Run;,DATA TEMP;SET DATA1;IF SEX1; RUN; PROC PLOT; PLOT HEIGHT*WEIGHT RUN;,PROC PLOT;PLOT AGEWEIGHT; RUN; PR

25、OC PRINT; RUN ;,SAS系统看到的是下面这此语句:,24 宏参数,把宏变量和宏结合起来,是编制宏时常用的方法。在上面的程序中,我们多次使用了LET语句,使得程序看起来比较累赘, 这时我们可以将宏变量作为宏定义语句MACRO的一部分,以精简SAS程序,如:macro plot(x ,y);proc plot;plot &x*&y;run;%mend plot;,%MACRO 语句后括号中的宏变量称为宏参数,在调用上面这段宏时,我们要给出各个参数的值,如:plot (height, weight)SAS看到的语句是:PROC PLOT;PLOT HEIGHTWEIGHT; RUN;,

26、这样,我们可以将上一节的程序修改为:data temp;set data1;if sex=1;run;%plot (height, weight);%plot (age, weight);proc print;run;,三、宏应用实例,3.1 用宏变量替代文本串,% let city=Shanghai;title “Data for 产生语句: TITLE “DATA FOR SHANGHAI”;注意:单引号 V.S. 双引号,3.2 用宏产生SAS代码,%macro plot; proc plot; plot income*age; run; %mend plot; data temp; s

27、et in.permdata; If age=20; Run; %plot Proc print; Run;,DATA TEMP; SET IN.PERMDATA; IF AGE=20; RUN; PROC PLOT; PLOT INCOME*AGE; RUN; PROC PRINT; RUN;,-,3.3 用宏参数在宏中传递信息,%macro plot(yvar=, xvar=); proc plot; plot %plot(yvar=income, xvar=age) %plot(yvar=income, xvar=yrs_educ),PROC PLOT; PLOT INCOME*AGE;

28、 RUN; PROC PLOT; PLOT INCOME*YRS_EDUC; RUN;,用宏参数在宏中传递信息,使用宏参数的好处:可以减少使用%LET语句,而且可以使变量不会对宏外部的程序产生干扰。 注意:在上面的宏定义中,宏参数后带有等号,这种宏参数称为关键字宏参数, 在调用这种宏时,必须写出宏参数名、等号和所赋给的值,但宏参数的位置可以任意排列,即上面的两个宏调用也可以这样写: %plot(xvar=age, yvar=income) %plot(xvar=yrs_educ, yvar=income),3.4 根据条件产生SAS代码,%macro whatstep(info=, mydat

29、a=); %if ,Proc report data=,如果对INFO和MYDATA赋值分别为print和grocery,即:% whatstep (info=print, mydata=grocery)产生程序为:PROC PRINT DATA=GROCERY;RUN;,如果对参数INFO和MYDATA赋值分别为report 和book,即:%whatstep (info=print, mydata=grocery)产生的程序为: OPTIONS NODATE NONUMBER PS=18 LS=70 FMTSEARCH=(SASUSER); PROC REPORT DATA=BOOK NO

30、WD; COLUMN MANAGER DEPT SALES; WHERE SECTOR=SE; FORMAT MANAGER $MGRFMT.DEPT$DEPTEMT.SALES DOLLAR11.2; TITLE SALES FOR THE SOUTHEAST SECTOR; RUN;,3.5 用循环语句%DO 产生重复的文本,%macro names (name=.number=); %do n=1 %to ,3.6 为宏变量引用产生后缀,%macro namesx (name=, number=); %do n=1 %to 注意:在宏变量NAME与字母X间使用了定界符“.”。,/*/ /

31、* 计算人口调查中的Myers Index程序 */ /*/ libname fam d:mohhealthfam2;data abc (keep=e w w1);set fam.fam2;e=int(98-k4)*12+(6-k5)/12); /*age in the 10 thru 49 */if e in (10,20,30,40) then w=1;if e in (11,21,31,41) then w=2;if e in (12,22,32,42) then w=3;if e in (13,23,33,43) then w=4;if e in (14,24,34,44) then

32、w=5;if e in (15,25,35,45) then w=6;if e in (16,26,36,46) then w=7;if e in (17,27,37,47) then w=8;if e in (18,28,38,48) then w=9;if e in (19,29,39,49) then w=10;if w=. then delete; /*age in the 20 thru 59 year */if e in (20,30,40,50) then w1=1;if e in (21,31,41,51) then w1=2;if e in (22,32,42,52) the

33、n w1=3;if e in (23,33,43,53) then w1=4;if e in (24,34,44,54) then w1=5;if e in (25,35,45,55) then w1=6;if e in (26,36,46,56) then w1=7;if e in (27,37,47,57) then w1=8;if e in (28,38,48,58) then w1=9;if e in (29,39,49,59) then w1=10;if w1=. then delete; run;,/* frequncies for age in 10 thru 49 */proc

34、 freq data=abc noprint;tables w/out=f1;proc freq data=abc noprint;tables w1/out=f2;run;data ff1;set f1 (rename=(count=count1) ;f1=w*count1;data ff2 ;set f2 (rename=(count=count2);w1=10-w1;f2=w1*count2;data m_s;/*unite ff1 and ff2 and sum for count*/merge ff1 ff2;count=f1+f2;run;proc means sum noprin

35、t data=m_s;var count;output out=temp sum=sm;data myers (drop=_type_ _freq_ sm percent sumn);merge m_s temp;sumn+sm;per=count/sumn*100;myers=abs(per-10);run;title “Myers Index“;proc print noobs data=myers;sum count per myers;run; title;proc datasets;delete abc f1 f2 ff1 ff2 m_s temp;run;quit;,libname fam d:mohhealthfam2;data abc (keep=e w w1);set fam.fam2;e=int(98-k4)*12+(6-k5)/12); %let age=if e in; /*age in the 10 thru 49 */,/* frequncies for age in 10 thru 49 */%macro freq (var,file);proc freq data=abc noprint;tables ,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报