• 《SAS编程与数据挖掘商业案例》学习笔记之十六


    《SAS编程与数据挖掘商业案例》学习笔记,本次重点:sas宏变量

    内容包含:宏变量、宏函数、宏參数、通配函数、字符函数、计算函数、引用函数、宏语句、宏应用

    1.宏触发器:

    %name-token:是一个宏语句或宏函数

    &name-token:是一个宏变量引用

    宏变量不依赖于sas数据集,能够在不论什么一个除数据行以外的地方定义和引用宏变量,一般定义的宏变量为局部变量,除非使用%global,定义宏变量用%let,显示宏变量用%put,调用宏变量用&

    eg

    %let a=xxx;

    %put &a;

    %put here is &a;

    Eg:带引號的文本中引用宏变量

    %let var=ddd;

    Data a;

    X="here is &var.";

    run;

    假设要正确引用宏变量var值,必须用双引號而不是单引號括住该文本,由于宏处理器仅仅能在双引號中进行替换。

     

    proc sql;

    create table temp as

    select *

    from sashelp.class

    where sex like '%M%'

    ;

    quit;

    eg:间接引用宏变量

    %let mvar=here;

    %let x=10;

    %put &&mvar.&x ;

    当程序读到第一个&时,立马启动宏触发器,因为存在句点号,故宏处理器会接受两个宏变量&mvar&x

    2.宏函数

    libname test ' f:data_modelook_datachapt10';

    options mstored sasmstore=test;

    %macro test / store ;   *是定义宏的keyword

     data a;

    x=1;

    run;

    %mend test;  是宏定义结束的标识

    宏存储,会将宏生成到对应文件夹以下的sasmar文件中面,

    调用永久存储的宏:

    libname test ' f:data_modelook_datachapt10';

    options mstored sasmstore=test;

    %test;

    3.宏參数

    宏功能强大之处在于宏參数,定义宏參数有两种方法,

    按值创建宏參数:

    %macro value(x=,y=);

    data test;

    x=&x.;

    y=&y.;

    run;

    %mend value;

    调用:

    %value(x=10,y=20);

    按地址创建宏參数

    %macro addr(x,y);

    data test;

    x=&x.;

    y=&y.;

    run;

    %mend addr;

    调用:

    �dr(10,20);

    4.通配函数

    是指可以在sas宏中引用data步的函数,最经常使用的通配函数是%sysfunc

    Eg;

    %num=10;

    %let x=%sysfunc(trim(%sysfunc(left(&num))));

    %put &x;

    Eg:translate函数应用

    %let string1 = v01n01-v01n10;

    %let string1 = %sysfunc(translate(&string1,p, n));

    %put with n translated to p, v01n01-v01n10 is &string1;

    eg:推断数据集是否存在

    %let dsn=%sysfunc(exist(sashelp.class));

    %put &dsn;

    5.计算函数

    宏计算函数有两个:

    %EVAL:计算算术和逻辑表达式(整数格式)

    %SYSEVALF:计算算术和逻辑表达式(浮点格式)

    Eg:

    %let a=1 2;

    %let b=10*3;

    %let c=5/3;

    %let eval_a=%eval_r(&a);

    %let eval_b=%eval_r(&b);

    %let eval_c=%eval_r(&c);

     

    %put &a is &eval_a;

    %put &b is &eval_b;

    %put &c is &eval_c;

    Eg:函数累加器

    %macro test(finish);

       %let i=1;

       %do %while (&i<&finish);

          %put the value of i is &i;

          %let i=%eval_r(&i 1);

       %end;

    %mend test;

    %test(5)

    eg

    %sysevalf(1/3,boolean)     

    %sysevalf(10 .,boolean)    

     

    %sysevalf(1 1.1,ceil)      

    %sysevalf(-1 -2.4,ceil)      

    %sysevalf(-1 1.e-11,ceil)  

    %sysevalf(10 .)          

     

    %sysevalf(-2.4,floor)         

    %sysevalf(3,floor)           

    %sysevalf(1.-1.e-13,floor)    

    %sysevalf(.,floor)          

     

    %put %sysevalf(2.1,integer);       

    %put %sysevalf(-2.4,integer);      

    %put %sysevalf(3,integer);         

    %put %sysevalf(-1.6,integer);      

    %put %sysevalf(1.-1.e-13,integer); 

    6.字符函数

    %index

    返回一个字符串第一次出现的位置

    %length

    返回自变量长度

    %QSCAN

    扫描单词,并引用包含%&的结果

    %QSUBSTR

    提取包含%&的子串,并引用包含%&的结果

    %QUPCASE

    转换包含%&的小写字符为大写

    %SCAN

    扫描单词,并返回一个结束引用的结果

    %substr

    提取子串,并返回一个结束引用的结果

    %upcase

    转换小写字符为大写字符,并返回一个结果引用的结果

    Eg:

    %macro a;

       aaaaaa

    %mend a;

    %macro b;

       bbbbbb

    %mend b;

    %macro c;

       cccccc

    %mend c;

     

    %let x=%nrstr(%a*%b*%%c);

    %put X: &x;

    %put The third word in X, with SCAN: %scan(&x,3,*);

    %put The third word in X, with QSCAN: %qscan(&x,3,*);

    7.引用函数

    %nrstr

    引用固定文本,包含&%

    %str

    引用固定文本,不包含&%

    %quote

    引用一个可分辨的值,不包含%&

    %nrbquote

    引用一个可分辨的值,包含未处理的特殊符号,&%sas操作符

    %nrquote

    引用一个可分辨的值,包含未处理的特殊字符

    eg

    %macro x;

    xxxxx;

    %mend x;

    %put : The result of str is :%str(%x);

    %put: The result of nrstr is :%nrstr(%x);

    eg

    %macro dept2(state);

       %if %quote(&state)=nc %then

           %put north carolina department of revenue;

       %else %if %quote(&state)=%str(or) %then

           %put department of revenue;

       %else %put others;

    %mend dept2;

    �pt2(or)

    调用�pt2(or)后,參数state获得值or,因为在sas系统里面or是一个逻辑操作符,所以为了得到纯文本含义的or,仅仅能用%quote

    8.宏语句

    eg

    %macro obs(parm);

       %let parm1 = %upcase(&parm);

       %if &parm1 = PRE %then

          %do;

             data pre_obs;

                set sashelp.class(obs=5);

        if sex="M" then y=1;

        else y=2;

             run;

          %end;

       %else %if &parm1 = POST %then

          %do;

             data post_obs;

                set sashelp.class(firstobs=6);

        if sex="M" then y=1;

        else y=2;

             run;

          %end;

    %mend obs;

    %obs(pre);

    eg

    %macro dow();

    %let i=1;

    %do %while (&i<5) ;

    %let i=%eval_r(&i. 1); 

    %put &i.;

    %end;

    %mend dow;

    %dow;

    eg:搜寻子字符串并输出

    %macro dw(word);

    %let i=1;

    data out;

    %do %while (%left(%scan(&word.,&i.)) ne %nrbquote(stop));

    %let var=%scan(&word.,&i.);

    %put &var.;

    out="&var";

    output;

    %let i=%eval_r(&i. 1);

    %put &i.;

    %end;

    run;

    %mend dw;

    %dw(%str(test1,test2,test3));

    9.宏应用

    eg:通过sql过程创建多个宏变量

    proc sql noprint;

       select nvar,nobs

       into:nvar , :nobs

       from dictionary.tables

       where libname = 'SASHELP' and memname = 'CLASS';

     

    quit;

    %put &nvar.;

    %put &nobs.;

    eg:通过sql过程用变量名创建宏变量列表

    proc sql noprint;

      select name

      into :clist1-:clist999

      from dictionary.columns

      where libname = 'SASHELP' and memname = 'CLASS';

    quit;

    %put &clist1.;

    %put &clist2.;

    eg:通过data步接口子程序call symputx

    data _null_;

    set sashelp.class nobs=obs;

    call symputx('m1',obs);

    call symput('m2',obs);

    Stop;

    run;

    %put &m1.;

    %put &m2.;

    注:symputx能消除后面參数的左右空格,而symput仅仅能消除右空格。

    eg:重命名指定文件夹下的sas数据集名称

    libname chap10 "f:data_modelook_datachapt10";

    %let rpt=rpt_temp;

    proc sql;

    create table chap10.change_tb_name as

    select

    memname

    from dictionary.tables

    where libname eq "CHAP10";

    quit;                                                 *上面主要是产生指定文件夹下全部sas数据集名称

    %macro change();

    %let dsid=%sysfunc(open(chap10.change_tb_name));                  1)打开数据集,每行执行一次open,并返回id给宏变量dsid

    %if &dsid gt 0 %then %do;                                                                   2)对返回的id号推断,若成功打开数据集,则id肯定非0,则运行do语句

    %let nobs=%sysfunc(attrn(&dsid,nobs));                                          3)抓取数据集的观測数,返回一个数值

    %do i=1 %to &nobs;                                                                              4)运行5次循环

    %let rc=%sysfunc(fetchobs(&dsid,&i));                                   5)抓取对于的观測

    %let varnume=%sysfunc(varnum(&dsid,memname));         6)找到memname所在的列位置

    %let table=%sysfunc(getvarc(&dsid,&varnume));                 7)抓取memname相应位置的值

    proc datasets lib=chap10;                                                       8)利用每一个返回的值,运行datasets过程步,改变对应数据集的名称

    change &table=&rpt._t&i.;

    quit;

    %end;                                                                                                     9)结束%do语句

    %let dsid=%sysfunc(close(&dsid));                                                 10)关闭数据集

       %end;                                                                                                         11)

    %mend change;

    %change;

  • 相关阅读:
    RESTful规范
    Vuex以及axios
    npm webpack vue-cli
    Vue生命周期
    Vue-Router
    Vue组件
    Vue基础以及指令
    1.JavaCC安装与测试
    10.InfluxDB-InfluxQL基础语法教程--OFFSET 和SOFFSET子句
    9.InfluxDB-InfluxQL基础语法教程--LIMIT and SLIMIT 子句
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4181920.html
Copyright © 2020-2023  润新知