嗜爱年华 发表于 2019-9-20 14:43:11

SAS创建宏变量的七种方法


SAS创建宏变量的七种方法
学会创建宏变量,特别是全局宏变量是应用宏的一个基础,下面我们介绍一下,创建宏变量的七种方法,并通过例子来演示。

1.通过宏函数创建宏变量。
%let dsid=%sysfunc(open(sashelp.class));
%let nvars=%sysfunc(attrn(&dsid,nvars));
%let dsid=%sysfunc(attrn(&dsid,nobs));
%let dsid=%sysfunc(close(&dsid));
%put &nvars.;
%put &nobs.;
程序解读:上边演示了如何使用统配宏函数和其他的SAS函数结合产生需要的结果。

2.通过SQL过程用变量值创建一个宏变量。
proc sql noprint;
   select distinct sex
   into :list_a separated by ' '
   from sashelp.class;
quit;
%put &list_a.;
程序解读:程序把变量sex的所有值distinct之后赋值给一个宏变量list_a。另外,上面的程序又用到了创建宏变量的一个关键字SEPARATED BY,该关键字可以对同一个宏变量用BY后面的单引号(或双引号)里面的符号隔开,如空格符号,逗号等。

3.通过SQL过程创建多个宏变量
proc sql noprint;
   select nvar,nobs
   into :nvar, :nobs
   from dictionary.tables
   where libname = 'SASHELP' and memname = 'CLASS';
/*注意:此处的SASHELP和CLASS必须要大写*/
quit;
%put &nvar.;
%put &nobs.;
程序解读:通过SQL过程获取宏变量是最常用的方法之一。上面程序讲解的是如何从数据字典里面获取逻辑库Sashelp的数据集CLASS。另外,由于这里需要创建两个宏变量,所以宏变量nvar和nobs之间用逗号隔开。

4.通过CONTENTS和SQL过程用变量名创建宏变量。
proc contents data=sashelp.class out=con_class;
run;
proc sql noprint;
   select name,put(count(name),5.-l)
   into :clist separated by ' ', :charct
   from con_class
   where type=2;;
quit;
%put &clist.;
%put &charct.;
程序解读:CONTENTS过程可以产生一个数据集的头文件,包含了多种该数据集的信息,查看输出数据集con_class内容,其中type=2表示字符型变量。

5.通过SQL过程用变量名创建宏变量列表。
proc sql noprint;
   selecct name
   into :clist1-:clist999
   from dictionary.columns
   where libname = 'SASHELP' and memname = 'CLASS';
quit;
%put &clist1.;
%put &clist2.;
程序解读:这段程序不同于上面的的4程序,这段程序是把所有的name值一一对应地赋值给不同的宏变量,宏变量列表可以用“-:”隔开。

6.通过SQL过程用变量值创建宏变量列表
proc sql noprint;
   select count(distinct sex)
   into :n
   from sashelp.class;
   select distinct sex
   into :type1 - :type%left(&n)
   from sashelp.class;
quit;
%put &n.;
%put &type1.;
程序解读:该程序首先创建一个用于计算变量值经过distinct之后的数值宏变量n,然后作为第二个宏变量列表的列表数的引用宏变量。

7.通过DATA步接口子程序CALL SYMPUTX。
data _null_;
   set sashelp.class nobs=obs;
   call symputx('m1',obs);
   call symput('m2',obs);
   Stop;
run;
%put &m1.;
%put &m2.;
程序解读:DATA步可以通过接口程序SYMPUTX和SYMPUT来创建全局宏变量。但是SYMPUTX和SYMPUT之间有一定的区别:SYMPUTX能消除后面参数的左右空格,而SYMPUT只能消除右空格,可以测试一下两者的区别,请看下边的代码:
data test&m1.;
   x=1;
run;

data test&m2.;
   x=1;
run;
程序解读:程序运行结果test&m2.会报错,查看日志会发现在&m2.解析后左边有很多空格,造成本来希望test1作为数据集的名字,但实际上没有达到效果。而test&m1.可以满足需求。


页: [1]
查看完整版本: SAS创建宏变量的七种方法