在工作中,有時(shí)一些操作只針對(duì)記錄數(shù)不為0的數(shù)據(jù)集進(jìn)行操作,在處理時(shí),就需要提前判斷。
程序思路介紹
判斷的思路不復(fù)雜,主要就是獲取數(shù)據(jù)集的記錄數(shù)。我常用的程序如下,其中省略號(hào)的部分是對(duì)記錄數(shù)不為0的數(shù)據(jù)集具體處理。
我最近做的是,只將記錄數(shù)不為0的數(shù)據(jù)集轉(zhuǎn)化成XPT文件,省略號(hào)處為轉(zhuǎn)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;
根據(jù)數(shù)據(jù)集記錄是否為0 ,可以將數(shù)據(jù)集分為兩類。但是這有一個(gè)前提,就是這個(gè)數(shù)據(jù)集得存在。如果數(shù)據(jù)集不存在,下面的程序也不會(huì)有意義。判斷數(shù)據(jù)集是否存在,使用的是exist函數(shù),具體用法可以參考SAS Help Center: EXIST Function。
如果去掉判斷數(shù)據(jù)集是否存在的語句,SQL生成宏變量nobs的程序可以正常運(yùn)行,但不會(huì)生成宏變量,下面判斷語句中引用宏變量nobs時(shí)就會(huì)有Warning。

SAS字典的訪問
數(shù)據(jù)集的觀測(cè)數(shù),是通過SAS字典來獲取,給大家展示一下SAS字典中的具體內(nèi)容,可以根據(jù)需要將字典中的信息保存到宏變量中,方便使用。
proc sql noprint;
create table tables as
select *
from dictionary.tables
where libname = upcase("sashelp")
;
quit;

上面是通過SQL語句訪問SAS字典,我們也可以通過DATA步進(jìn)行訪問SAS字典,訪問之后也可以使用call symputx語句將需要的信息保存到宏變量中。
data tables;
set sashelp.vtable
where libname = upcase("sashelp") and memname = "CLASS";
call symputx("nobs", strip(nobs, best.));
run;
以上兩個(gè)程序?qū)Ρ?,SQL和Data步所取的SAS字典的數(shù)據(jù)集是不同的,dictionary.xxxx這一類數(shù)據(jù)集只能在SQL語句中進(jìn)行調(diào)用, sashelp.vxxxx在SQL和Data步中都可以調(diào)用。兩類數(shù)據(jù)集的命名也有區(qū)別,dictionary中,以s結(jié)尾,sashelp中以v開頭。我們可以看一下,SAS字典中有哪些數(shù)據(jù)集。
proc sql noprint;
create table tmp as
select *
from sashelp.vtable
where libname = "SASHELP" and substr(memname, 1,1)="V"
;
quit;

常用的SAS字典有macros, tables, columns,感興趣的讀者可以自己運(yùn)行下程序,看一下這幾個(gè)數(shù)據(jù)集中保存的信息。
總結(jié)
這篇文章介紹了只對(duì)記錄數(shù)不為0的數(shù)據(jù)集進(jìn)行操作的宏程序,也介紹了SAS字典的兩種訪問方式,希望對(duì)讀者SAS編程有幫助。