《SAS宏编程技术》PPT课件.ppt

上传人:s9****2 文档编号:570104531 上传时间:2024-08-02 格式:PPT 页数:87 大小:2.57MB
返回 下载 相关 举报
《SAS宏编程技术》PPT课件.ppt_第1页
第1页 / 共87页
《SAS宏编程技术》PPT课件.ppt_第2页
第2页 / 共87页
《SAS宏编程技术》PPT课件.ppt_第3页
第3页 / 共87页
《SAS宏编程技术》PPT课件.ppt_第4页
第4页 / 共87页
《SAS宏编程技术》PPT课件.ppt_第5页
第5页 / 共87页
点击查看更多>>
资源描述

《《SAS宏编程技术》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《SAS宏编程技术》PPT课件.ppt(87页珍藏版)》请在金锄头文库上搜索。

1、第第14章章 宏编程技术宏编程技术清华大学经管学院清华大学经管学院 朱世武朱世武本章内容包括:本章内容包括: 概述;宏变量;宏;宏参数;宏表达式;宏引用;宏工具中的输入输出;数据步接口程序;宏程序语句和宏函数。概述概述 宏工具是一种可以用来扩展SAS功能,减少普通工作文本输入量的SAS工具。宏工具可以给一段文本或SAS程序命名,并通过引用这个名称来使用这段程序或文本。宏工具的功能非常强大,使用宏工具来完成以下任务。使用宏变量实现文本替代;使用宏产生程序语句;使用宏循环及条件判断语句完成程序交互。宏变量宏变量 定义宏变量定义宏变量用宏程序语句%LET来定义宏变量。%letDSN=ResDat.c

2、lass;例中,DSN是宏变量名,ResDat.class为宏变量DSN的值。引用宏变量引用宏变量 在宏变量前加&来引用宏变量的值。例14.1引用宏变量A。%leta=ResDat.class;dataa;set&a;run;上段程序等价于:dataa;setResDat.class;run;例14.2宏处理器只能在双引号内进行替代。%leta=january;data;putThisisthetimeseriesplotfor&A;run;例中,在引号内引用宏变量的值时必须用双引号。因为宏处理器只能在双引号内进行替代。606%leta=january;607data;608putThisis

3、thetimeseriesplotfor&A;609run;ThisisthetimeseriesplotforjanuaryNOTE:数据集WORK.DATA1有1个观测和0个变量。NOTE:“DATA语句”所用时间(总处理时间):实际时间0.01秒CPU时间0.01秒例14.3多次引用宏变量。%leta=ResDat.class;datamale;set&a;ifsex=M;procprint;titleSUBSETOF&A;datafemale;set&a;ifsex=F;procprint;titleSUBSETOF&A;run;例14.4改变宏变量的值。%letm=2000;%let

4、n=1;dataa;setResDat.stk000002;whereyear(date)=&mandmonth(date)=&n;procgplotdata=a;title2&m年&n月份收盘价时序图;plotclpr*date=1;symbol1v=stari=joinr=1c=red;run;例中,改变宏变量的值,如:%LETN=2,3,4,5,.,12可以分别得到12个月的时序图。不过,更好的方法是用宏循环来实现这里的要求。例14.5宏变量的值为一段完整的SAS程序段。%letplot=%str(procgplotdata=a;plotclpr*date=1;symbol1v=star

5、i=joinr=1c=red;run;);例中,必须使用%STR函数围住宏变量的值,在以后的程序中可以用&PLOT来引用这段程序。%letm=2000;%letn=1;dataa;setResDat.stk000002;whereyear(date)=&mandmonth(date)=&n;&plot;title2&m年&n月份收盘价时序图;run;例中,如果不执行宏&PLOT步的程序时,可将其设定为空值(%LETPLOT=;)。例14.6宏变量的嵌套引用。%letm=2000;%letn=1;%letxvar=date;%letyvar=clpr;%letplot=%str(procgplo

6、tdata=a;title2&m年&n月份收盘价时序图;plot&yvar*&xvar=1;symbol1v=stari=joinr=1c=red;run;);dataa;setResDat.stk000002;whereyear(date)=&mandmonth(date)=&n;run;&plot;procprint;title&m年&n月份收盘价;run;如何隔开宏变量引用和文本如何隔开宏变量引用和文本 l在混合使用宏变量引用和文本的时候,会遇到宏变量后面紧跟着文本的情况。l如定义宏变量name后,当使用&name1,&name2时,如果不定义name1和name2这两个宏变量,系统就会

7、提示这两个宏变量并不存在,因为在SAS识别宏变量的时候,自动将name1和name2当成了宏变量的名称。l在宏的引用过程中,当词段扫描器识别一个宏变量名称时,从&开始直到遇到一个SAS名称中不允许出现的字符为止。所以空格等一些不允许出现在SAS名称中的字符就可以作为分隔符出现,但是为了不显示这些分隔符,一般使用句号来作为分隔符使用。例14.7隔开宏变量引用和文本。%letname=Resdat;%PUT&name1;%put&name.1;%put&name.sheet;/*日志窗口信息*/12%letname=ResDat;13%PUT&name1;ResDat114%put&name.1;

8、ResDat115%put&name.sheet;ResDat.sheet显示宏变量值显示宏变量值 显示宏变量的最简单方法是使用%put语句,它将文本输出到SAS的日志窗口。语句格式:%PUT ;例14.8显示宏变量的值。data_null_;%leta=first;%letb=macrovariable;%put&a!&b!;run;LOG窗口显示:first!macrovariable!间接引用宏变量间接引用宏变量 对一系列的宏变量引用,如data1,data2,data3,这一系列中部分文本是固定的名称,而另一部分是变化的数字。这时就可以采取间接引用方式。例14.9间接引用宏变量。%le

9、tdata1=x;%letdata2=y;%letdata3=z;%macrotest;%doi=1%to3;%put&data&i;/*&data&i不能用*/%end;%mendtest;%test宏变量范围宏变量范围 l 宏变量以使用范围分为全局宏变量和局部宏变量l 全局变量可以在SAS对话运行期间使用并且可以在程序的任何地方引用l 局部变量则只能在创建该局部变量的宏中使用,在这个宏之外,这个局部变量就没有任何意义。宏宏 宏是被编辑过的可以从SAS程序中调用的程序。同宏变量一样,一般可以使用宏来产生文本。 定义宏的格式:%MacroMAC;文本;%mendMAC;例14.10定义宏plo

10、t。%macroplot;procgplotdata=ResDat.stk000002;title2收盘价时序图;plotclpr*date=1;symbol1v=stari=joinr=1c=red;%mendplot;调用一个宏调用一个宏 用一个百分号(%)加宏名字就可以调用该宏。例14.11定义并调用宏plot。%macroplot;procgplotdata=ResDat.stk000002;title2收盘价时序图;plotclpr*date=1;symbol1v=stari=joinr=1c=red;%mendplot;/*以上定义宏plot*/%plot;/*调用宏*/run;改

11、变宏内宏变量的值改变宏内宏变量的值 例14.12改变宏内宏变量的值,分以下几步完成。定义宏plot:%macroplot;procgplotdata=ResDat.&dat;title2&pr时序图;plot&price*date=1;symbol1v=stari=joinr=1c=red;%mendplot;定义宏变量:%letdat=stk000002;%letpr=收盘价;%letprice=clpr;调用宏plot:%plot;改变宏变量的值:%letdat=stk000002;%letpr=最高价;%letprice=hipr;再次调用宏plot:%plot;run;以上各段程序可以

12、连在一起运行。宏参数宏参数 宏变量和宏结合在一起是一种强有力的编程方法。但应用起来并不十分方便。最常用的是在宏中使用宏参数。宏参数是一种特殊的宏变量,是定义在宏%MACRO语句内的宏变量。例14.13创建宏参数。%macroplot(dat,pr,price);procgplotdata=ResDat.&dat;title2&pr时序图;plot&price*date=1;symbol1v=stari=joinr=1c=red;%mendplot;例中,在%MACRO语句括号内定义的宏变量DAT,PR和PRICE称为宏参数。例14.14通过给宏参数赋值来调用宏。%plot(stk000002,

13、收盘价,clpr);例中,运行时,宏处理器把第一个值(stk000002)赋给第一个宏参数DAT,第二个值(收盘价)赋给第二个宏变量PR,以此类推。使用宏参数的优点:可以少写几个%let语句;保证该宏参数变量在宏之外的程序部分不被引用;调用宏时并不需要知道这些宏参数的名字,只要知道相应的取值。宏参数赋值宏参数赋值 例14.16创建宏参数时直接赋值。%macroplot(dat=stk000002,pr=收盘价,price=clpr);procgplotdata=ResDat.&dat;title2&pr时序图;plot&price*date=1;symbol1v=stari=joinr=1c=

14、red;%mendplot;%plot;run;例14.17运行宏时赋值。%macroplot(dat,pr,price);procgplotdata=ResDat.&dat;title2&pr时序图;plot&price*date=1;symbol1v=stari=joinr=1c=red;%mendplot;%plot(stk000002,收盘价,clpr);%plot(stk000002,最高价,hipr);run;宏调用宏宏调用宏 产生数据集宏:.%macro create;data temp;set ResDat.&dat;if year(date)=&year;%mend crea

15、te;画时序图宏: %macro plot;proc gplot data=temp;title2 &pr &year1 时序图;plot &price*date=1;symbol1 v=star i=join r=1 c=red;%mend plot;run;宏调用宏:%macroanalyze(dat,year,pr,price,year1);%create;/*产生数据集TEMP*/%plot;/*作图*/%mendanalyze;运行宏:%analyze(stk000002,2000,收盘价,clpr,2000);run;条件表达式条件表达式 例14.19用条件表达式%if-%then

16、定义宏。%macroanalyze(getdata,dat,year,pr,price,year1);%if&getdata=yes%then%create;%plot;%mendanalyze;%analyze(yes,stk000002,2000,收盘价,clpr,2000);%analyze(no,stk000002,2000,最高价,hipr,2000);run;生成重复文本生成重复文本 例14.22定义生成重复文本宏。%macronames(name,number);%don=1%to&number;&name&n%end;%mendnames;例中,宏names通过宏参数name,

17、number和宏变量n可以生成一系列的名字。在DATA语句中调用宏NAMES:data%names(dsn,5);run;产生下列data步语句:DATADSN1DSN2DSN3DSN4DSN5;620%end;621%mendnames;622data%names(dsn,5);623run;NOTE:数据集WORK.DSN1有1个观测和0个变量。NOTE:数据集WORK.DSN2有1个观测和0个变量。NOTE:数据集WORK.DSN3有1个观测和0个变量。NOTE:数据集WORK.DSN4有1个观测和0个变量。NOTE:数据集WORK.DSN5有1个观测和0个变量。NOTE:“DATA语句

18、”所用时间(总处理时间):实际时间0.06秒CPU时间0.04秒LOG窗口显示:宏引用宏引用 使用%STR或%NRSTR在宏编译阶段可以屏蔽掉一些特殊字符,避免这些特殊字符影响宏处理器组建宏语句的方式。 例14.24 使用%STR或%NRSTR来屏蔽一个单个的单引号或双引号或括号时,特殊字符前加上%号。%let test1=%STR(Mr smiths house); /*出现错误*/Quit;%let test2=%STR(Mr smith%s house);%put &test1 &test2;数据步接口程序数据步接口程序 v宏处理器只在DATA步或PROC步的编译期间起作用。如果想用数据

19、步产生的信息值创建宏变量,以便于在后面的程序中使用,可以用下面的编程技术。数据步接口程序数据步接口程序 下面两个接口程序可在DATA步执行期间创建宏变量,指定它们的值,及重新得到它们的值。数据步接口程序例14.28由数据步产生的信息值创建宏变量。%macrocreate;datatemp;setResDat.&datend=final;ifyear(date)=&yearthendo;n+1;output;end;iffinalthencallsymput(number,n);/*创建的宏变量为number,其值为n*/run;%mendcreate;%macroplot;procgplotd

20、ata=temp;title2&pr&year1时序图;plot&price*date=1;symbol1v=stari=joinr=1c=red;%mendplot;run;%macroanalyze(getdata,dat,year,pr,price,year1);%if%upcase(&getdata)=YES%then%create;footnotePlotof&numberObservations;%plot;%mendanalyze;%analyze(yes,stk000002,1999,收盘价,clpr,1999);%analyze(yes,stk000002,2000,收盘价,

21、clpr,2000);%analyze(yes,stk000002,2001,收盘价,clpr,2001);run;v例中,由于SYMPUT子程序用BEST12.的 格 式 输 出 N的 值 , 故NUMBER的值居右。为了使该值居左,在SYMPUT子程序中使用LEFT函数。宏程序语句和宏函数宏程序语句和宏函数 v宏功能包括很多宏程序语句和宏函数。下面列出部分SAS系统有效的宏程序设计语句和宏函数。宏程序设计语句及用途宏程序设计语句及用途 语句用途Do条件处理至一个匹配的%END语句Do%Until重复循环直到条件为真End结束%DO组Global创建全局宏变量%If-%Then/%Else有

22、条件执行宏Input为宏变量提供值Let创建宏变量Macro-Name调用宏Macro定义宏Mend结束宏定义Put输出文件到LOG窗口宏函数宏函数 宏计算函数宏计算函数函数名说明Eval计算算术和逻辑表达式整数格式%SYSEVALF计算算术和逻辑表达式浮点格式宏引用函数宏引用函数 函数名说明%Nrstr引用固定文本,包括%和&%Quote引用一个除和&之外的可分辩值%Str引用除和&之外的固定文本例14.30用%EVAL函数计算宏表达式的值。data;%letx=100;%lety=%eval(&x+200);%letz=&x+200;%puty=&yz=&z;run;提交上述程序后,Log

23、窗口显示的结果为:y=300z=100+200例中,宏变量Y的值是一数值,而宏变量Z的值是字符串”100+200”。例14.31用%substr函数生成某字符串的子串。data%substr(&sysday,1,3);run;47data%substr(&sysday,1,3);48run;NOTE:数据集WORK.FRI有1个观测和0个变量。NOTE:“DATA语句”所用时间(总处理时间):实际时间0.09秒CPU时间0.00秒LOG窗口显示例14.32用%QOUTE函数引用一个可分辩的值。%macrodept(X);%if%quote(&X)=fn%then%putFinancialDep

24、artment;%else%putotherDepartment;%menddept;%dept(fn);%dept(math);run;49%macrodept(X);50%if%quote(&X)=fn%then51%putFinancialDepartment;52%else%putotherDepartment;53%menddept;54%dept(fn);FinancialDepartment55%dept(math);otherDepartment56run;LOG窗口显示第第15章章 数据管理数据管理清华大学经管学院清华大学经管学院 朱世武朱世武ZResdat样本数据:样本数据

25、:SAS论坛:论坛: SAS系统提供的过程按其用途可分为四大类:数据管理;基础统计;数据呈现;数据访问。和任何一种编程语言一样,SAS系统有一些数据管理过程,用于实现常用的中间操作或数据转换。本章将介绍的数据管理过程:本章将介绍的数据管理过程: 数据集排序;数据集转置;改变输出地点;添加观测;数据库复制。数据集排序数据集排序 利用SAS的排序过程可以对数据集中的观测重新排序。SAS许多和BY配合使用的语句,如对数据集进行合并的语句或更新语句等,使用前必须先对BY变量进行排序。排序过程句法排序过程句法PROC SORT;BYvariable-1.variable-n;PROC SORT语句语句

26、PROC SORT;选项说明:DATA=规定被排序数据集,缺省时为最新创建数据集OUT=创建输出数据集,省略时用排序后数据集替换原数据集ASCII规定按ASCII排序SWEDISH规定按Swedish排序NATIONAL规定按习惯排序FORCE强行实施多余排序其中:其中:选选项项FORCE强强行行实实施施多多余余排排序序。排排序序并并替替换换原原来来加加索索引引的的或或取取子子集集的的数数据据集集,即即没没有有规规定定OUT=选选项项时时,如如果果没没有有规规定定FORCE,就不能对有索引的数据集进行排序和替换。就不能对有索引的数据集进行排序和替换。没有规定OUT=选项时必须使用FORCE的选

27、项有:OBS=系统选项;FIRSTOBS=系统选项;DATA=数据集中的数据集选项WHERS=;PROCSORT步用WHERE语句。BY语句语句 BY variable-1variable-n;PROCSORT中必须使用BY语句,BY语句中可以规定任意多个变量。BY语句中规定多个变量时,SORT过程首先按第一个变量排序,然后是第二个变量等。BY语句中可以规定的选项:DESCENDING对变量按下降次序排序。应用举例应用举例 例15.1按多变量排序。dataa;setResDat.Idx000001;year=year(date);qtr=qtr(date);month=month(date);

28、procsortdata=aout=b;byyearqtrmonth;run;例中,对上证数据Idx000001按年、季和月排序。例15.2按单变量降序排列。 procsortdata=ResDat.a600001out=a;bydescendingclpr; procprintdata=a(obs=3)noobs;vardateclpr; run;例中,按收盘价CLPR的降序排列。数据集转置数据集转置 转置就是把数据集的观测变为变量,变量变为观测。利用SAS的转置过程可以对数据集进行转置。转置过程句法转置过程句法 PROC TRANSPOSE; BYvariable-1.variable-n

29、;COPYvariable(s);ID variable;IDLABELvariable;VARvariable(s);语句说明:PROC TRANSPOSE 语句语句 PROC TRANSPOSE;选项说明:VAR语句和语句和ID语句语句 VAR语句VARvariable-list;VAR语句列出要转置的变量。没有VAR语句时,则没有列在其它语句里的所有数值变量被转置。ID语句IDvariable;ID语句规定输入数据集中一个变量。ID变量的值为转置后数据集的变量名。在没有选项LET时,ID变量的值在数据集中只能出现一次,使用BY语句,BY组内只包含最后的ID值。应用举例应用举例 例15.4

30、ID变量的值为转置后数据集的变量名。proctransposedata=ResDat.classout=alet;idname;procprint;run;例中,原数据集CLASS中变量NAME的值为转置后数据集A的变量名,对所有数值变量转置。数据集A中还有一变量_NAME_.SAS系统12007年03月07日星期五下午09时21分17秒Obs_NAME_AliceBarbaraCarolJaneJanetJoyceJudyLouiseMaryAlfred1Age13.013.014.012.015.011.014.012.015.014.02Height56.565.362.859.862.

31、551.364.356.366.569.03Weight84.098.0102.584.5112.550.590.077.0112.0112.5ObsHenryJamesJeffreyJohnPhilipRobertRonaldThomasWilliam114.012.013.012.01612.01511.015.0263.557.362.559.07264.86757.566.53102.583.084.099.5150128.013385.0112.0例15.5BY组内最后一个ID值的观测被转置。proctransposedata=ResDat.classout=alet;idsex;p

32、rocprint;run;结果显示:proctransposedata=ResDat.classout=alet;idsex;bysex;procprint;run;结果显示:例15.8对每个BY组转置。optionsnodatepageno=1linesize=80pagesize=40;proctransposedata=ResDat.fishdataout=fishlength(rename=(col1=Measurement);varlength1-length4;bylocationdate;run;procprintdata=fishlengthnoobs;titleFishLen

33、gthDataforEachLocationandDate;run;FishLengthDataforEachLocationandDate1LocationDate_NAME_MeasurementColePond02JUN95Length131ColePond02JUN95Length232ColePond02JUN95Length332ColePond02JUN95Length433ColePond03JUL95Length133ColePond03JUL95Length234ColePond03JUL95Length337ColePond03JUL95Length432ColePond

34、04AUG95Length129输出窗口显示例例15.10 对转置后的数据集作统计分析。对转置后的数据集作统计分析。options nodate pageno=1linesize=80 pagesize=40;datasplit;setResDat.weights;arrays7s1-s7;subject+1;doTime=1to7;strength=stime;output;end;drops1-s7;run;procprintdata=split(obs=15)noobs;titleSplitDataSet;title2First15ObservationsOnly;run;/*接左侧*/

35、proctransposedata=splitout=totsplitprefix=Str;byprogramsubject;copytimestrength;varstrength;run;procprintdata=totsplit(obs=15)noobs;titleTotsplitDataSet;title2First15ObservationsOnly;run;改变输出地点改变输出地点 缺省情况下,SAS过程输出到OUTPUT窗口,SAS日志输出到LOG窗口。利用SAS的PRINTTO过程可以设定SAS过程和日志的输出地点。PRINTTO过程有以下功能:改变过程输出的目的地;改变SA

36、S日志输出的目的地;有选择地限制SAS输出;将输出结果存放在永久文件中;将输出直接送到打印机上;将SAS的输出作为输入数据(这时需要一些附加的程序语句)。PRINTTO过程句法过程句法 PROC PRINTTO;选项说明注意:一般情况下,PROCPRINTTO后面一定要加RUN语句。若省略RUN语句,则会丢失PRINTTO后面DATA步或PROC步第一行的输出。应用举例应用举例 例15.11将SAS日志输出到外部永久文件。procprinttolog=d:log.dat;/*直接输出到永久文件中*/filenamef1d:out.txt;procprinttolog=f1;/*输出到文件标记*

37、/例15.12将运行结果输出到外部永久文件。filenamef2d:out.list;procprinttoprint=f2;/*输出到文件标记*/procprinttoprint=d:out.list;/*直接输出到永久文件中*/例15.13直接打印输出结果。filenamefprinter;procprinttoprint=f;/*直接打印*/procprinttoprint=print;/*返回到缺省输出地点*/例15.14替换原输出文件。procprinttoprint=d:out.txtlog=d:log.datnew;procprintdata=ResDat.class;run;添

38、加观测添加观测 利用SAS的APPEND过程可以将一个SAS数据集的观测添加到另一个SAS数据集的后面。APPEND过程句法过程句法 PROC APPENDBASE=SAS-data-set;APPEND过程中只需要一个语句。选项说明:BASE=|OUT=规定基本数据集的名子DATA=|NEW=规定要添加在基本数据集后面的数据集名,缺省时使用最近创建的SAS数据集FORCE强迫PROCAPPEND连接两数据集应用举例应用举例 例15.17有条件添加数据。procappendbase=data1data=data2(where=(X=1);run;procappendbase=adata=Res

39、Dat.stk000001(where=(year(date)=1999);run;例中,使用数据集选项WHERE=或WHERE语句来限制DATA=的数据集中只有满足条件的观测被加到BASE=的数据集中。数据库复制数据库复制利用SAS的COPY过程可以复制整个SAS数据库或其中的数据库成员。COPY过程句法过程句法 PROC COPYOUT=libref-1IN=libref-2MOVE;EXCLUDESAS-file(s); SELECTSAS-file(s)/;子语句说明:Select规定要拷贝数据库IN=中的成员;Exclude规定不拷贝数据库IN=中的成员。PROC COPY语句选项语

40、句选项 选项说明:有效的成员类型(MEMTYPE):应用举例应用举例 例15.18两个SAS逻辑库之间复制数据集和目录册。proccopyin=lib1out=lib2MTYPE=(datacatalog);run;例15.19将逻辑库LIB1的所有SAS文件移动到LIB2中。proccopyin=lib1out=lib2move;run;例15.21选择以DAT开头的所有文件。dataResDat.datResDat.dat1ResDat.dat2ResDat.dat3(alter=zsw);var=move;run;proccopyin=ResDatout=workmove;selectdat:(alter=zsw);run;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号