美文网首页
SAS宏程序:如何只对记录数不为0的数据集进行操作?

SAS宏程序:如何只对记录数不为0的数据集进行操作?

作者: 野藤_ | 来源:发表于2022-03-25 19:38 被阅读0次

    在工作中,有时一些操作只针对记录数不为0的数据集进行操作,在处理时,就需要提前判断。

    程序思路介绍

    判断的思路不复杂,主要就是获取数据集的记录数。我常用的程序如下,其中省略号的部分是对记录数不为0的数据集具体处理。

    我最近做的是,只将记录数不为0的数据集转化成XPT文件,省略号处为转XPT的宏程序。

    %macro data(lib=, dt=);
    
    %if %sysfunc(exist(&lib..&dt.)) %then %do;
      proc sql noprint;
        select nobs into: nobs
          from dictionary.tables
          where libname = upcase("&lib.") and memname = upcase("&dt.")
        ;
      quit;
    
      %if &nobs > 0 %then %do;
          ......
      %end;
    %end;
    
    %mend data;
    

    根据数据集记录是否为0 ,可以将数据集分为两类。但是这有一个前提,就是这个数据集得存在。如果数据集不存在,下面的程序也不会有意义。判断数据集是否存在,使用的是exist函数,具体用法可以参考SAS Help Center: EXIST Function

    如果去掉判断数据集是否存在的语句,SQL生成宏变量nobs的程序可以正常运行,但不会生成宏变量,下面判断语句中引用宏变量nobs时就会有Warning。

    Log

    SAS字典的访问

    数据集的观测数,是通过SAS字典来获取,给大家展示一下SAS字典中的具体内容,可以根据需要将字典中的信息保存到宏变量中,方便使用。

      proc sql noprint;
        create table tables as
        select *
          from dictionary.tables
          where libname = upcase("sashelp") 
        ;
      quit;
    
    Tables

    上面是通过SQL语句访问SAS字典,我们也可以通过DATA步进行访问SAS字典,访问之后也可以使用call symputx语句将需要的信息保存到宏变量中。

    data tables;
      set sashelp.vtable
      where libname = upcase("sashelp")  and memname = "CLASS";
      call symputx("nobs", strip(nobs, best.));
    run;
    

    以上两个程序对比,SQL和Data步所取的SAS字典的数据集是不同的,dictionary.xxxx这一类数据集只能在SQL语句中进行调用, sashelp.vxxxx在SQL和Data步中都可以调用。两类数据集的命名也有区别,dictionary中,以s结尾,sashelp中以v开头。我们可以看一下,SAS字典中有哪些数据集。

    proc sql noprint;
      create table tmp as
        select *
          from sashelp.vtable
          where libname = "SASHELP" and substr(memname, 1,1)="V"
        ;
    quit;
    
    SAS字典

    常用的SAS字典有macros, tables, columns,感兴趣的读者可以自己运行下程序,看一下这几个数据集中保存的信息。

    总结

    这篇文章介绍了只对记录数不为0的数据集进行操作的宏程序,也介绍了SAS字典的两种访问方式,希望对读者SAS编程有帮助。

    相关文章

      网友评论

          本文标题:SAS宏程序:如何只对记录数不为0的数据集进行操作?

          本文链接:https://www.haomeiwen.com/subject/qbjdjrtx.html