设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1383|回复: 0

SAS创建宏变量的七种方法

[复制链接]

14

主题

167

金钱

238

积分

入门用户

发表于 2019-9-20 14:43:11 | 显示全部楼层 |阅读模式

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

1.通过宏函数创建宏变量。
  1. %let dsid=%sysfunc(open(sashelp.class));
  2. %let nvars=%sysfunc(attrn(&dsid,nvars));
  3. %let dsid=%sysfunc(attrn(&dsid,nobs));
  4. %let dsid=%sysfunc(close(&dsid));
  5. %put &nvars.;
  6. %put &nobs.;
复制代码

程序解读:上边演示了如何使用统配宏函数和其他的SAS函数结合产生需要的结果。

2.通过SQL过程用变量值创建一个宏变量。
  1. proc sql noprint;
  2.    select distinct sex
  3.    into :list_a separated by ' '
  4.    from sashelp.class;
  5. quit;
  6. %put &list_a.;
复制代码

程序解读:程序把变量sex的所有值distinct之后赋值给一个宏变量list_a。另外,上面的程序又用到了创建宏变量的一个关键字SEPARATED BY,该关键字可以对同一个宏变量用BY后面的单引号(或双引号)里面的符号隔开,如空格符号,逗号等。

3.通过SQL过程创建多个宏变量
  1. proc sql noprint;
  2.    select nvar,nobs
  3.    into :nvar, :nobs
  4.    from dictionary.tables
  5.    where libname = 'SASHELP' and memname = 'CLASS';
  6. /*注意:此处的SASHELP和CLASS必须要大写*/
  7. quit;
  8. %put &nvar.;
  9. %put &nobs.;
复制代码

程序解读:通过SQL过程获取宏变量是最常用的方法之一。上面程序讲解的是如何从数据字典里面获取逻辑库Sashelp的数据集CLASS。另外,由于这里需要创建两个宏变量,所以宏变量nvar和nobs之间用逗号隔开。

4.通过CONTENTS和SQL过程用变量名创建宏变量。
  1. proc contents data=sashelp.class out=con_class;
  2. run;
  3. proc sql noprint;
  4.    select name,put(count(name),5.-l)
  5.    into :clist separated by ' ', :charct
  6.    from con_class
  7.    where type=2;;
  8. quit;
  9. %put &clist.;
  10. %put &charct.;
复制代码

程序解读:CONTENTS过程可以产生一个数据集的头文件,包含了多种该数据集的信息,查看输出数据集con_class内容,其中type=2表示字符型变量。

5.通过SQL过程用变量名创建宏变量列表。
  1. proc sql noprint;
  2.    selecct name
  3.    into :clist1-:clist999
  4.    from dictionary.columns
  5.    where libname = 'SASHELP' and memname = 'CLASS';
  6. quit;
  7. %put &clist1.;
  8. %put &clist2.;
复制代码

程序解读:这段程序不同于上面的的4程序,这段程序是把所有的name值一一对应地赋值给不同的宏变量,宏变量列表可以用“-:”隔开。

6.通过SQL过程用变量值创建宏变量列表
  1. proc sql noprint;
  2.    select count(distinct sex)
  3.    into :n
  4.    from sashelp.class;
  5.    select distinct sex
  6.    into :type1 - :type%left(&n)
  7.    from sashelp.class;
  8. quit;
  9. %put &n.;
  10. %put &type1.;
复制代码

程序解读:该程序首先创建一个用于计算变量值经过distinct之后的数值宏变量n,然后作为第二个宏变量列表的列表数的引用宏变量。

7.通过DATA步接口子程序CALL SYMPUTX。
  1. data _null_;
  2.    set sashelp.class nobs=obs;
  3.    call symputx('m1',obs);
  4.    call symput('m2',obs);
  5.    Stop;
  6. run;
  7. %put &m1.;
  8. %put &m2.;
复制代码

程序解读:DATA步可以通过接口程序SYMPUTX和SYMPUT来创建全局宏变量。但是SYMPUTX和SYMPUT之间有一定的区别:SYMPUTX能消除后面参数的左右空格,而SYMPUT只能消除右空格,可以测试一下两者的区别,请看下边的代码:
  1. data test&m1.;
  2.    x=1;
  3. run;

  4. data test&m2.;
  5.    x=1;
  6. run;
复制代码

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


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表