2009-09-28 8 views

risposta

19

L'opzione nobs= a un'istruzione set può fornire il numero di osservazioni. Quando la fase di dati viene compilata, la porzione di intestazione dei set di dati di input viene scansionata, quindi non è nemmeno necessario eseguire l'istruzione set per ottenere il numero di osservazioni. Per esempio, i seguenti rapporti 2 come previsto:

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

L'opzione end= imposta un flag quando l'ultima osservazione (per l'istruzione set) viene letta in

Un SAS insieme di dati, tuttavia, può essere. un file di dati SAS o una vista SAS. Nel caso di quest'ultimo, il numero di osservazioni potrebbe non essere noto né al momento della compilazione né al momento dell'esecuzione.

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

Grazie per la moltitudine di opzioni qui, ho finito per andare con l'opzione FINE per ora. Bello vedere una varietà di modi per farlo :) – chucknelson

7

trova il numero di osservazioni in un insieme di dati SAS:

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

data _null_; 
    put "&nobs"; 
run; 

La porzione SQL registra il numero delle observaions, e memorizza il numero in una variabile macro denominata "Nobs". Il passo dati mette il numero per la visualizzazione, ma è possibile utilizzare la variabile macro come qualsiasi altra.

L'esecuzione di una determinata azione quando l'ultima osservazione viene elaborato:

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

L'opzione "fine" al "set" dichiarazione definisce una variabile (in questo caso "EOF" per la fine del file) che è impostato su 1 quando viene elaborata l'ultima osservazione. È quindi possibile verificare il valore della variabile ed eseguire azioni quando il suo valore è 1. Per ulteriori informazioni, consultare la documentazione per l'istruzione "set".

+0

Grazie per questo - visto che l'opzione variabile macro è sicuramente utile sapere :) – chucknelson

+0

Il vantaggio di questi approcci è che sono semplici. Lo svantaggio è che sono sloooow quando vengono eseguiti su set di dati con un numero elevato di righe, in quanto SAS ha effettivamente bisogno di scorrere il dataset per ottenere un risultato. Una tecnica migliore è quella di interrogare i metadati usando una tecnica come le visualizzazioni di cmjohns sotto. –

+0

@RobPenridge Interrogare i metadati è sicuramente un buon modo per farlo. Si noti che non tutti i motori di dati lo supportano, quindi l'approccio più generale è quello di contare. Il rilevamento dell'ultima osservazione è spesso utile, e in questo caso un approccio alla query sui metadati sarebbe meno elegante, data la variabile eof automatica. –

10

È inoltre possibile utilizzare %sysfunc(attrn(dataset, nlobs)) anche se è limitato a insiemi di dati SAS (cioè non viste di dati). Credito per la macro a this SUGI paper, che fornisce anche grandi informazioni sulla buona progettazione macro.

È possibile ottenere tutti i tipi di altri caratteri e informazioni numeriche su un dataset SAS.

Vedere la documentazione su attrn e 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; 
Problemi correlati