2009-09-28 8 views

Odpowiedz

19

Opcja nobs= do instrukcji set może podać liczbę obserwacji. Po skompilowaniu kroku danych część nagłówkowa wejściowych zestawów danych jest skanowana, więc nie trzeba nawet wykonywać instrukcji set, aby uzyskać liczbę obserwacji. Na przykład, następujące raporty 2 zgodnie z oczekiwaniami:

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

Opcja end= ustawia flagę podczas ostatniej obserwacji (dla rachunku set) jest czytany w

SAS zbiór danych, jednak może być. plik danych SAS lub widok SAS. W przypadku tego ostatniego liczba obserwacji może nie być znana w czasie kompilacji lub w czasie wykonywania.

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

Dzięki za mnóstwo opcji tutaj, skończyłem w tym miejscu z opcją END. Świetnie, aby zobaczyć całą gamę sposobów na zrobienie tego :) – chucknelson

7

Znajdź liczbę obserwacji w zbiorze danych SAS:

proc sql noprint; 
    select count(*) into: nobs 
    from sashelp.class 
    ; 
quit; 

data _null_; 
    put "&nobs"; 
run; 

Część SQL zlicza liczbę observaions i przechowuje numer w makro zmiennej o nazwie „NOBS”. W kroku danych umieszczana jest liczba do wyświetlenia, ale można użyć zmiennej makro jak każda inna.

Wykonywanie pewnych działań, gdy ostatnia obserwacja jest przetwarzany:

data _null_; 
    set sashelp.class end=eof; 
    if eof then do; 
    put name= _n_=; 
    end; 
run; 

Opcja „end” do „set” oświadczenie definiuje zmienną (tu „EOF” do EOF), który jest ustawiona na 1, gdy przetwarzana jest ostatnia obserwacja. Następnie można przetestować wartość zmiennej i wykonać akcje, gdy jej wartość wynosi 1. Więcej informacji można znaleźć w dokumentacji instrukcji "set".

+0

Dzięki za to, że makro - o zmiennej opcja jest zdecydowanie przydatny wiedzieć :) – chucknelson

+0

Zaletą tych metod jest to, że są one proste. Wadą jest to, że są one sloooow, gdy są uruchamiane na zestawach danych z dużą liczbą wierszy, ponieważ SAS rzeczywiście musi iterować przez zbiór danych, aby uzyskać wynik. Lepszą techniką jest zapytanie do metadanych za pomocą techniki, takiej jak wyświetlacze cmjohns poniżej. –

+0

@RobPenridge Odpowiadanie na metadane jest dobrym sposobem na zrobienie tego. Należy pamiętać, że nie wszystkie silniki danych obsługują to, więc najbardziej ogólnym podejściem jest liczenie. Wykrywanie ostatniej obserwacji jest często przydatne, a tutaj podejście do zapytania o metadane byłoby mniej eleganckie, biorąc pod uwagę automatyczną zmienną eof. –

10

Można również użyć %sysfunc(attrn(dataset, nlobs)) choć ogranicza się do zbiorów danych SAS (to nie liczba wyświetleń danych). Kredyt dla tego makra na this SUGI paper, który również dostarcza wspaniałych informacji dotyczących dobrego projektu makr.

Możesz uzyskać wszystkie rodzaje innych znaków i informacji numerycznych w zestawie danych SAS.

Zobacz dokumentację na temat attrn i attrc.

%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; 
Powiązane problemy