Savoir trouver le nombre d’observations dans un data set SAS : tel est le sujet d’aujourd’hui. Connaître le nombre d’observations dans un jeu de données présente plusieurs avantages. En voici deux :
- Définir une condition pour qu’un code soit exécuté.
- Définir une boucle pour exécuter un code autant de fois qu’il y a d’observations dans le data set d’origine.
Dans les deux cas, on choisi ici de sauvegarder ce nombre dans une macro variable. Quelles sont les méthodes à disposition pour trouver ce nombre ? Je vous en propose d’en détailler six. Celles-ci fonctionnent également lorsque le data set est vide d’observations.
Exemples illustrés avec le data set ORIG : pour illustrer les différentes méthodes, j’utilise un jeu de données nommé ORIG ne contenant pas d’observations.
data orig;
x=1;
*if x=1 then output;
if x=1 then delete;
run;
L’instruction %PUT permet de voir la valeur de mes macro variables dans la LOG.
1. La fonction COUNT dans PROC SQL : la procédure SQL et sa fonction COUNT permettent de retrouver le nombre total d’observations dans le data set lu, si on n’utilise pas de GROUP BY. L’étoile signifie « TOUTES LES OBSERVATIONS », indépendamment de la variable. Si le nombre d’observations est stocké dans une variable, la valeur s’affiche pour chaque observation. Comme cette valeur est la même pour toutes les observations, on peut n’en afficher qu’une seule via DISTINCT. On peut sauvegarder cette information dans une macro variable via INTO:. Si le DISTINCT n’est pas utilisé, seule la première valeur sera sauvegardé dans la macro variable. DISTINCT est donc optionnel dans ce cas précis.
proc sql noprint;
select distinct count(*) into: methode1
from orig;
quit;
%put METHOD 1 = &methode1. ;
2. SQLOBS, une macro variable automatique à utiliser avec précaution : lorsqu’un data set est créé avec une procédure SQL, on peut, juste après, retrouver l’information avec la macro variable automatique &SQLOBS. Il faut bien faire attention de ne pas inclure d’autres data sets entre temps, lors d’une mise à jour par exemple. SQLOBS récupère le nombre d’observations du dernier jeu de données quelque soit son nom.
proc sql ;
create table methode2 as
select *
from orig;
quit;
%put METHODE 2 = &sqlobs. ;
3. Les métadonnées des dictionnaires SAS : le dictionnaire TABLES liste tous les data sets de toutes les bibliothèques et des informations supplémentaires les caractérisant. Ainsi la variable NOBS contient le nombre d’observations dans le data set. Ici on choisi INTO: pour sauvegarder ce nombre dans une macro variable.
proc sql noprint;
select nobs into: methode3
from dictionary.tables
where upcase(libname)=’WORK’ and
upcase(memname)=’ORIG’;
quit;
%put METHODE 3 = &methode3. ;
4. ATTRN comme « SAS Component Language » ou SCL : le SCL nommé ATTRN permet d’accéder au nombre d’observations. Pour cela, le nom du data set en question et le mot clé NOBS sont données. Ce SCL est accessible via %SYSFUNC. Pour lire le data set et extraire cette information, il faut au préalable, l’ouvrir et ensuite le fermer pour éviter des bugs, via les SCL OPEN et CLOSE. On réfère donc au data set via la macro variable DSID ouvrant le data set.
%let dsid = %sysfunc(open(work.orig,in));
%let methode4 = %sysfunc(attrn(&dsid,nobs));
%if &dsid. > 0 %then %let rc = %sysfunc(close(&dsid));
%put METHODE 4 = &methode4. ;
5. La variable automatique _N_ : dans un data step, une variable nommée _N_ est créée automatique. Elle contient le nombre total d’itérations effectuées par SAS. Ainsi, si aucune donnée n’est lue, _N_=1. Une fois la lecture d’une observation faite par exemple, SAS revient juste après l’instruction DATA et _N_ est incrémenté de 1. Le nombre d’observations dans le data set est donc _N_-1. Ce nombre est sauvegardé ici dans une macro variable appelée METHODE5 créée via une instruction CALL SYMPUTX.
data_null_;
call symputx(‘methode5’,_N_-1);
set orig;
run;
%put METHODE 5 = &methode5. ;
6. L’option NOBS de l’instruction SET : en précisant un nom après l’option NOBS= de l’instruction SET, la valeur de NOBS est sauvegardée dans une variable. Ici, elle s’appelle METHODE6. L’instruction CALL SYMPUTX permet de sauvegarder cette valeur dans une macro variable. La manière dont SAS traite le code est très importante ici. Les explications d’Alain vous sont données plus bas.
data _null_;
if 0 then set orig nobs=methode6;
call symputx(‘methode6’,methode6);
stop;
run;
Le « IF 0 » est une instruction toujours fausse, donc l’exécution de l’instruction
conditionnée ne sera jamais réalisée. La récupération du nombre d’observations
depuis le dictionnaire du data set se fait au moment de la compilation par le SAS DATA
COMPILER, qui stocke dans une variable qui est forcément temporaire citée avec
l’option « NOBS= ».
L’instruction STOP ne permet pas d’écourter le temps de lecture des données car il
n’y pas d’exécution de lecture. Alors que se passe-t-il ?
L’étape DATA étant une boucle automatique dès qu’une instruction de lecture (Set ,
Merge, Modify, Update, …) de data set est détectée par le Superviseur SAS et par
compilateur de l’étape DATA , l’exécution de la boucle est automatique à cause de la
détection de l’instruction « SET » et SAS va vérifier si le test
induit par l’instruction « IF 0 » (comprendre if 0 =1) n’est pas devenu vrai !
D’où la nécessité de poser l’instruction SAS « STOP », pour éviter la boucle de
l’étape DATA.
(SUPERVISEUR SAS : Agent pivot qui distribue le code soumis par PARSING, soit au
DATASTEP COMPILER, PROCEDURE PARSER ou au Compilateur MACRO)
Publié dans %sysfunc, attrn, call symputx, close, count, Data Management, Data Step, Les Fontions, Les procédures, open, Par Etapes, Par niveaux, Par thématique, proc sql, SAS débutant | Tagué attrn, close, compter, count, dictionaire, dictionary, fonction, macro variable, NOBS, nombre, obs, observation, observations, open, proc sql, SAS, sqlobs, sysfunc, variable automatique, _N_ | 4 Comments »
février 20, 2008
Vous avez une variable composée d’un ou plusieurs mots pour chaque observation, le tout séparé par des espaces, des virgules ou autre. Et vous voulez savoir combien il y a de mots. Avec SAS 9, il est très rapide de trouver le nombre de mots. Avec SAS 8.2, il faut pallier à l’absence de la fonction COUNT. Dans les deux cas, l’idée est la même : on compte les délimiteurs et on ajoute 1.
Prenons le cas des espaces. Dans un premier temps, on enlève les blancs de début et de fin de chaîne. Puis on enlève les doublons entre les mots. Enfin on compte les espaces restants. Il faudra aussi tenir compte du fait qu’une observation puisse ne contenir aucune valeur.
Voici les données qui serviront d’exemple :
data ds_orig;
x=‘ AB CD GH ‘;
output;
x=‘ ‘;
output;
x=‘AB ‘;
output;
run;
1. Avec SAS 9, un calcul rapide : il faudra faire appel à:
-
la fonction STRIP pour les blancs aux extrémités,
-
la fonction COMPBL pour enlever les blancs doublons,
-
la fonction COUNT pour compter le nombre d’occurrence d’un caractère donné,
-
la fonction MISSING ou un simple = ‘ ‘ pour savoir si la chaîne est vide.
Voici un exemple avec des espaces pour délimiteur.
data sas9 ;
set ds_orig;
if x = ‘ ‘ then nb_mots = 0;
else nb_mots=count(compbl(strip(x)),‘ ‘) + 1;
run;
2. Avec SAS 8.2, il faut contourner l’absence de la fonction COUNT: il existe plusieurs options dont celle-ci utilisant une boucle DO WHILE:
-
Les fonctions TRIM et LEFT remplacent la fonction STRIP.
-
Les fonctions COMPLB et MISSING restent valide.
-
Une boucle remplacera la fonction COUNT.
On extrait le 1er mot de la chaîne, puis le 2nd, etc. via la fonction SCAN. Si la valeur trouvée est une valeur manquante, alors le nombre de mots est égal au nombre du boucles sans valeur manquante, c’est-à-dire le nombre de boucles actuel moins 1. Le compteur, ici nommé i, est réinitialisé pour arrêter la boucle DO WHILE.
data sas8_2;
set ds_orig;
if missing(x)then cnt_mots=0;
else
do;
z=compbl(trim(left(x)));
i=1;
do until (i=0);
if missing(scan(z,i,‘ ‘))then
do;
cnt_mots=i-1;i=->1;
end;
i=i+1;
end;
drop i z;
end;
run;
Publié dans Base, compbl, count, Data Management, Fonctions, left, Les Fontions, missing, Par Etapes, Par Niveau Certification, Par niveaux, Par thématique, SAS débutant, scan, strip, trim | Tagué COMPBL, compter, count, do while, function, LEFT, missing, mots, nombre, occurence, SAS, scan, STRIP, TRIM | 1 Comment »