2009-09-28 20 views

回答

19

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 
*/ 
+0

感謝這裏的衆多選項,我現在結束了w/END選項。很高興看到各種各樣的方式來做到這一點:) – chucknelson 2009-09-29 12:42:12

7

查找一個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」語句的文檔。

+0

感謝這個 - 具有宏變量的選擇是絕對方便知道:) – chucknelson 2009-09-29 14:10:26

+0

這些方法的好處是,他們很簡單。不足之處在於,如果在具有大量行的數據集上運行時,它們會很慢,因爲SAS實際需要遍歷數據集以獲取結果。一個更好的技術是使用下面的cmjohns顯示技術來查詢元數據。 – 2012-01-05 09:40:06

+0

@RobPenridge查詢元數據確實是一個好方法。請注意,並非所有的數據引擎都支持它,所以最常用的方法是數一數。檢測最後一次觀察通常是有用的,在這裏給出自動eof變量,元數據查詢方法將不太優雅。 – 2012-01-07 18:54:20

10

儘管它僅限於SAS數據集(即不是數據視圖),您也可以使用%sysfunc(attrn(dataset, nlobs))。對宏觀信貸this SUGI paper,這也提供了良好的宏觀設計信息。

您可以在SAS數據集上獲得各種其他字符和數字信息。

請參閱關於attrnattrc的文檔。

%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; 
5
data hold; 
    set input_data end=last;  
    .  
    . 
    . 
    if last then do; 
    . 
    . 
    . 
    end; 
run; 
相關問題