美文网首页
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