web-dev-qa-db-fra.com

Comment détecter combien d'observations dans un jeu de données (ou s'il est vide), dans SAS?

Je me demande s'il existe un moyen de détecter si un ensemble de données est vide, c'est-à-dire qu'il ne contient aucune observation. Ou dans un autre dicton, comment obtenir le nombre d'observations dans un ensemble de données spécifique.

Pour que je puisse écrire une instruction If pour définir certaines conditions.

Merci.

18
mj023119

C'est facile avec PROC SQL. Faites un comptage et mettez les résultats dans une variable macro.

proc sql noprint;
 select count(*) into :observations from library.dataset;
quit;
18
Laurent de Walick

Il y a beaucoup de manières différentes, j'ai tendance à utiliser une fonction macro avec open() et attrn(). Voici un exemple simple qui fonctionne très bien la plupart du temps. Si vous allez avoir affaire à des vues de données ou à des situations plus complexes comme avoir un ensemble de données avec des enregistrements marqués pour suppression ou des clauses where actives, vous aurez peut-être besoin d'une logique plus robuste.

%macro nobs(ds);
    %let DSID=%sysfunc(OPEN(&ds.,IN));
    %let NOBS=%sysfunc(ATTRN(&DSID,NOBS));
    %let RC=%sysfunc(CLOSE(&DSID));
    &NOBS
%mend;

/* Here is an example */
%put %nobs(sashelp.class);
14
cmjohns

Voici l'exemple le plus complet dont parlait @cmjohns. Il renverra 0 s'il est vide, -1 s'il est manquant, et dispose d'options pour gérer les observations supprimées et les clauses where (notez que l'utilisation d'une clause where peut rendre la macro longue sur de très grands ensembles de données).

Notes d'utilisation:

Cette macro renverra le nombre d'observations dans un ensemble de données. Si l'ensemble de données n'existe pas, -1 sera renvoyé. Je ne recommanderais pas cela pour une utilisation avec ODBC libnames, utilisez-le uniquement contre SAS tables.

Paramètres:

  • iDs - Les libname.dataset que vous souhaitez vérifier.
  • iWhereClause ( Facultatif) - Une clause where à appliquer
  • iNobsType ( Facultatif) - Soit NOBS OR NLOBSF. Voir documentation SASV9 pour les descriptions .

Définition de la 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;

Exemple d'utilisation:

%put %nobs(iDs=sashelp.class);
%put %nobs(iDs=sashelp.class, iWhereClause=height gt 60);
%put %nobs(iDs=this_dataset_doesnt_exist);

Résultats

19
12
-1

Installation

Je recommande de configurer un bibliothèque d'appels automatiques SAS et de placer cette macro dans votre emplacement d'appel automatique.

8
Robert Penridge

Proc sql n'est pas efficace lorsque nous avons un grand ensemble de données. Bien que l'utilisation d'ATTRN soit une bonne méthode, mais cela peut accomplir dans les sas de base, voici la solution efficace qui peut donner un nombre d'observations de même des milliards de lignes simplement en lisant une ligne:

data DS1;
set DS nobs=i;
if _N_ =2 then stop;
No_of_obs=i;
run;
3
Altumish

Je suppose que j'essaye de réinventer la roue ici avec déjà tellement de réponses. Mais je vois d'autres méthodes essayer de compter à partir de l'ensemble de données réel - cela peut prendre beaucoup de temps pour d'énormes ensembles de données. Voici une méthode plus efficace:

proc sql;
select nlobs from sashelp.vtable where libname = "library" and memname="dataset";
quit;
1
enautic

L'astuce consiste à produire une sortie même lorsque l'ensemble de données est vide.

data CountObs;

    i=1;
    set Dataset_to_Evaluate point=i nobs=j; * 'point' avoids review of full dataset*;
    No_of_obs=j;
    output;  * Produces a value before "stop" interrupts processing *;
    stop;   * Needed whenever 'point' is used *;
    keep No_of_obs;
run;

proc print data=CountObs;
run;

Le code ci-dessus est le moyen le plus simple que j'ai trouvé pour produire le nombre d'observations même lorsque l'ensemble de données est vide. J'ai entendu dire que NOBS peut être délicat, mais ce qui précède peut fonctionner pour des applications simples.

1
HandsomeDude

Une approche légèrement différente:

proc contents data=library.dataset out=nobs;
run;

proc summary data=nobs nway;
class nobs;
var delobs;
output out=nobs_summ sum=;
run;

Cela vous donnera un ensemble de données avec une observation; la variable nobs a la valeur du nombre d'observations dans l'ensemble de données, même si elle est égale à 0.

1
Rory Wilsher