Este es el ejemplo más completo del que hablaba @cmjohns. Devolverá 0 si está vacío, -1 si falta y tiene opciones para manejar las observaciones eliminadas y las cláusulas where (tenga en cuenta que el uso de una cláusula where puede hacer que la macro tome mucho tiempo en conjuntos de datos muy grandes).
Notas
de uso:
Esta macro devolverá el número de observaciones en un conjunto de datos. Si el conjunto de datos no existe, se devolverá -1. No recomendaría esto para su uso con nombres de libras ODBC, úsela solo en tablas SAS.
Parámetros:
- IDS - El
libname.dataset
que desea comprobar.
- iWhereClause (Opcional) - una cláusula WHERE de aplicar
- iNobsType (Opcional) - O
NOBS
O NLOBSF
. Ver SASV9 documentation para descripciones.
definición de macro:
%macro nobs(iDs=, iWhereClause=1, iNobsType=nlobsf, iVerbose=1);
%local dsid nObs rc;
%if "&iWhereClause" eq "1" %then %do;
%let dsID = %sysfunc(open(&iDs));
%end;
%else %do;
%let dsID = %sysfunc(open(&iDs(where=(&iWhereClause))));
%end;
%if &dsID %then %do;
%let nObs = %sysfunc(attrn(&dsID,nlobsf));
%let rc = %sysfunc(close(&dsID));
%end;
%else %do;
%if &iVerbose %then %do;
%put WARNING: MACRO.NOBS.SAS: %sysfunc(sysmsg());
%end;
%let nObs = -1;
%end;
&nObs
%mend;
Ejemplo de Uso:
%put %nobs(iDs=sashelp.class);
%put %nobs(iDs=sashelp.class, iWhereClause=height gt 60);
%put %nobs(iDs=this_dataset_doesnt_exist);
Resultados
19
12
-1
instalación
recomiendo la creación de un SAS autocall library y la colocación de esta macro en su ubicación autocall.
Gracias a Laurent por la respuesta rápida. Parece que ** seleccionar en ** es muy útil. – mj023119
Hola Laurent: Esto está bien para conjuntos de datos pequeños, pero para grandes conjuntos de datos puede llevar mucho tiempo ejecutarlos, ya que tiene que leer cada observación en lugar de solo mirar los metadatos de la tabla. Vea algunas de las otras respuestas a continuación para un enfoque más eficiente. –
'count (var_name)' lee cada observación, pero 'count (*)' no. – Ryan