2009-09-28 11 views

Respuesta

19

La opción nobs= de una declaración set puede darle el número de observaciones. Cuando se compila el paso de datos, se escanea la porción de encabezado de los conjuntos de datos de entrada, por lo que ni siquiera tiene que ejecutar la instrucción set para obtener el número de observaciones. Por ejemplo, los siguientes informes 2 como se esperaba:

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

La opción end= establece un indicador cuando la última observación (para la declaración set) se lee en

conjunto de datos Un SAS, sin embargo, puede ser. un archivo de datos SAS o una vista SAS. En el caso de este último, el número de observaciones puede no conocerse ni en tiempo de compilación ni en tiempo de ejecución.

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

Gracias por la multitud de opciones aquí, terminé yendo con la opción END por ahora. Genial para ver una gran variedad de formas de hacer esto :) – chucknelson

7

encuentra el número de observaciones en un conjunto de datos SAS:

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

data _null_; 
    put "&nobs"; 
run; 

La porción de SQL cuenta el número de observaions, y almacena el número en una variable macro llamada "nobs". El paso de datos coloca el número para mostrar, pero puede usar la variable de macro como cualquier otra.

realizar una determinada acción cuando se procesa la última observación:

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

La opción de "fin" a la "set" declaración define una variable (en este caso "EF" para EOF) que es establecer en 1 cuando se procesa la última observación. Luego puede probar el valor de la variable y realizar acciones cuando su valor es 1. Para obtener más información, consulte la documentación de la declaración "establecer".

+0

Gracias a este - Vista esa opción macro variable es, sin duda muy útil para saber :) – chucknelson

+0

La ventaja de estos métodos es que son simples. La desventaja es que son poco frecuentes cuando se ejecutan en conjuntos de datos con una gran cantidad de filas, ya que SAS realmente necesita iterar a través del conjunto de datos para obtener un resultado. Una mejor técnica es consultar los metadatos utilizando una técnica como cmjohns muestra a continuación. –

+0

@RobPenridge Consultar los metadatos es una buena manera de hacerlo. Tenga en cuenta que no todos los motores de datos lo admiten, por lo que el enfoque más general es contar. La detección de la última observación a menudo es útil, y aquí un enfoque de consulta de metadatos sería menos elegante, dada la variable eof automática. –

10

También puede utilizar %sysfunc(attrn(dataset, nlobs)) aunque se limita a conjuntos de datos SAS (es decir, no se incluyen vistas de datos). Crédito por macro a this SUGI paper, que también brinda gran información sobre un buen diseño macro.

Puede obtener todo tipo de caracteres e información numérica en un conjunto de datos SAS.

Consulte la documentación en attrn y 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; 
Cuestiones relacionadas