有沒有辦法在運行時檢查SAS數據集中有多少觀察值,或者是否檢測到何時您已經到達DATA步驟中的最後一個觀察值?有沒有辦法在SAS數據步驟中檢測到最後一次觀察結果?
我似乎無法找到任何網絡上的這個看似簡單的問題。謝謝!
有沒有辦法在運行時檢查SAS數據集中有多少觀察值,或者是否檢測到何時您已經到達DATA步驟中的最後一個觀察值?有沒有辦法在SAS數據步驟中檢測到最後一次觀察結果?
我似乎無法找到任何網絡上的這個看似簡單的問題。謝謝!
nobs=
選項到set
語句可以給你觀察的數量。編譯數據步驟時,會掃描輸入數據集的標題部分,因此您甚至不必執行set
語句以獲取觀察值的數目。舉例來說,如預期下列報告2:
/* a test data set with two observations and no vars */
data two;
output;
output;
run;
data _null_;
if 0 then set two nobs=nobs;
put nobs=;
run;
/* on log
nobs=2
*/
的end=
選項設置一個標誌,當最後一次觀察(爲set
語句)中讀取
一個SAS數據集,但是,可以是。 SAS數據文件或SAS視圖。就後者而言,在編譯時或執行時可能不知道觀察次數。
data subclass/view=subclass;
set sashelp.class;
where sex = symget("sex");
run;
%let sex=F;
data girls;
set subclass end=end nobs=nobs;
put name= nobs= end=;
run;
/* on log
Name=Alice nobs=9.0071993E15 end=0
Name=Barbara nobs=9.0071993E15 end=0
Name=Carol nobs=9.0071993E15 end=0
Name=Jane nobs=9.0071993E15 end=0
Name=Janet nobs=9.0071993E15 end=0
Name=Joyce nobs=9.0071993E15 end=0
Name=Judy nobs=9.0071993E15 end=0
Name=Louise nobs=9.0071993E15 end=0
Name=Mary nobs=9.0071993E15 end=1
*/
查找一個SAS數據組觀察結果的數目:
proc sql noprint;
select count(*) into: nobs
from sashelp.class
;
quit;
data _null_;
put "&nobs";
run;
SQL部分計數observaions的數量,並存儲在被稱爲「NOBS」宏變量的數目。 數據步驟將顯示數字,但可以像使用其他宏一樣使用宏變量。
執行當最後的觀察被處理某個動作:即
data _null_;
set sashelp.class end=eof;
if eof then do;
put name= _n_=;
end;
run;
「結束」選項「設置」語句定義(文件結束的-這裏「EOF」)的可變在最後一次觀察處理時設爲1。然後,您可以測試變量的值,並在其值爲1時執行操作。有關更多信息,請參閱「set」語句的文檔。
感謝這個 - 具有宏變量的選擇是絕對方便知道:) – chucknelson 2009-09-29 14:10:26
這些方法的好處是,他們很簡單。不足之處在於,如果在具有大量行的數據集上運行時,它們會很慢,因爲SAS實際需要遍歷數據集以獲取結果。一個更好的技術是使用下面的cmjohns顯示技術來查詢元數據。 – 2012-01-05 09:40:06
@RobPenridge查詢元數據確實是一個好方法。請注意,並非所有的數據引擎都支持它,所以最常用的方法是數一數。檢測最後一次觀察通常是有用的,在這裏給出自動eof變量,元數據查詢方法將不太優雅。 – 2012-01-07 18:54:20
儘管它僅限於SAS數據集(即不是數據視圖),您也可以使用%sysfunc(attrn(dataset, nlobs))
。對宏觀信貸this SUGI paper,這也提供了良好的宏觀設計信息。
您可以在SAS數據集上獲得各種其他字符和數字信息。
%macro numobs (data=&syslast) ;
/* --------------------------------------------
Return number of obs as a function
--------------------------------------------
*/
%local dsid nobs rc;
%let data = &data ; /* force evaluation of &SYSLAST */
%let dsid=%sysfunc(open(&data));
%if &dsid > 0 %then
%do ;
%let nobs=%sysfunc(attrn(&dsid,nlobs));
%let rc=%sysfunc(close(&dsid));
%end ;
%else
%let nobs = -1 ;
&nobs
%mend numobs;
data hold;
set input_data end=last;
.
.
.
if last then do;
.
.
.
end;
run;
感謝這裏的衆多選項,我現在結束了w/END選項。很高興看到各種各樣的方式來做到這一點:) – chucknelson 2009-09-29 12:42:12