Posts Tagged ‘cntlin’

h1

Aller-Retour entre dataset et catalogue de formats avec CNTLIN en CNTLOUT

décembre 29, 2012

Dans un précédent article, je parlais des deux méthodes pour créer des formats avec une procédure proc format, la première étant de taper toutes les values dans une instruction value, la seconde étant de stocker ces valeurs dans un data set et de les convertir en format avec l’option cntlin. Aujourd’hui, je souhaite revenir sur l’option CNTLIN et son pendant CNTLOUT pour passer d’un dataset à un format et pour passer d’un format à un dataset.

1. Créer une table SAS (dataset) type

Pour débuter créons un data set (table SAS) appelée POP avec 4 colonnes START, LABEL, TYPE et FMTNAME. Cette table contient les données pour deux formats : un format numérique et un format alphanumérique. Ces deux formats sont appelés GRP.

data pop;
length start $40 label $200 type $1 fmtname $32;
retain fmtane 'GRP' type 'N';
start='10';
label='Per Protocol';
output;
start='11';
label='Modified Per Protocol';
output;
start='20';
label='Intent-to-Treat';
output;
start='21';
label='Modified Intent-to-Treat';
output;
type='C';
start='PP';
label='Per Protocol';
output;
start='mPP';
label='Modified Per Protocol';
output;
start='ITT';
label='Intent-to-Treat';
output;
start='mITT';
label='Modified Intent-to-Treat';
output;
run;

S’il est possible de convertir de convertir le nombre 100 stocker dans une variable alphanumérique en numérique, il est impossible de convertir le mot ABC en numérique. Dans cet exemple on comprend mieux pour quoi START est toujours alphanumérique qu’il s’agisse dun format numérique ou alphanumérique.

2. Passer d’un dataset à un format catalog

A présent la procédure proc format convertit le data set en format catalogue. Le data set est situé dans la bibliothèque (library) WORK. Il n’y a pas besoin de préciser la bibliothèque de la table POP. Par défaut le format catalog s’appellera FORMATS et sera stocké dans la bibliothèque WORK. L’option LIB n’est pas utilisé.

proc format cntlin=pop;
run;

Ainsi le code au dessus est équivalent à :

proc format cntlin=work.pop lib=work.formats;
run;

Le code proposé ci-dessus est uniquement là pour faciliter la compréhension. Sauf besoin particulier, la version simplifiée doit suffire.

3. Passer d’un format catalog à un dataset

Dans un second temps, je vous propose de convertir ce format dans un autre dataset.

proc format cntlout=pop2; 
run;

Ainsi le code au dessus est équivalent à :

proc format cntout=work.pop2 lib=work.formats; 
run;

A vous de jouez avec les proc print et librairies pour voir la résultat.

4. Rappel sur le nom du format

Notez ici que le nom du format est au maximum long de 32 caractères en  SAS 9.1.3 / SAS 9.2  et limité à 8 caractères pour la version SAS 8.2. Pour être plus précis, on a 32 caractères pour un format numérique et 31 caractères pour un format alphanumérique en SAS 9.1.3 et SAS 9.2, SAS gardant un caractère pour le symbole dollar $. SAS 8.2 fonctionnait sur le même principe : 8 caractères pour un format numérique et 7 caractères pour un format alphanumérique. Si le nom du format était trop long en SAS 8.2, SAS le coupe à la longueur maximum. Ainsi les nom  ALPHABETA et ALPHABETI sont interprétés pas SAS 8.2 en FMTNAME=ALPHABET pour un format numérique.

Aller plus loin

h1

La 3ème méthode qui fait la différence pour sélectionner en se basant sur une second data set

février 16, 2009

Suite au précieux conseil d’Arnaud Gaborit (A.I.D.), je vous propose de compléter l’article du 26 janvier dernier intitulé « Deux méthodes pour sélectionner en se basant sur une second data set« . Les personnes travaillant sur de grosses bases de données apprécieront.

Lectures complémentaires :

1. Rappel : les données et le résultat attendu

D’un côté, on a un data set contenant la liste des effets secondaires observés. Il y a une ligne par effet secondaire. Seuls les patients ayant eu un effet secondaire sont enregistrés.

data ae_multi;
   input patref ae_id;
   datalines;
1 1
1 2
2 1
4 1
4 2
5 1
;
run;

De l’autre côté, on a la liste des patients correspondant à la population qui nous intéresse. Une ligne correspond à un patient.

data pat_uniq;
   input patref;
   datalines;
2
3
4
;
run;

Le but est de garder uniquement les effets secondaires des patients présents dans notre population.

patref ae_id

   2     1
   4     1
   4     2

2. Créer un format à partir d’un data set

Dans une premier temps, un format numérique (TYPE=N est la valeur par défaut) appelé PATREF (FMTNAME=’PATREF’) est créé à partir du data set sur les patients. La variable PATREF sert de valeur START. Pour toutes les valeurs de START, on applique le même libellé (LABEL=’retenir’).

Si le data set contient plusieurs variables (ce qui sera généralement le case), l’option KEEP servira à limiter la sélection à la variable servant à définir START.

data pat (keep=start fmtname label);
   set pat_uniq (rename=(patref=start)); *(keep=patref);
   fmtname='PATREF';
   label='retenir';
run;

Si plusieurs valeurs identiques pour la variable START sont présentes dans votre fichier, vous devrez supprimer les doublons. L’étape suivante ne marchera pas sinon.

*proc sort data=pat nodupkey;
*by start;
*run;

Le data set est à présent convertit en format au moyen de l’option CNTLIN. Ce format est sauvegardé par défaut dans le catalogue FORMATS de la bibliothèque WORK.

proc format cntlin=pat;
run;

3. Sélectionner les observations de son choix

Ici, l’option WHERE est privilégiée à l’instruction IF pour des raisons de performance.

Ensuite, grâce à la fonction PUT, les valeurs de PATREF sont converties en RETENIR si elles sont présentes dans le data set PAT_UNIQ. Seules ces valeurs RETENIR sont gardées.

data ae_multi;
   set ae_multi (where=(put(patref,patref.) = 'retenir'));
run;

Voir le résultat :

proc print data=ae_multi;
run;
h1

2 méthodes pour de nouveaux formats

février 13, 2008

Deux méthodes sont disponibles pour créer des formats sous SAS :

  • entrée les données manuellement dans une instruction value d’une part ;
  • réutiliser les données stockées dans un SAS data set.

Chacune des méthodes à un champ d’action privilégié.

  • On préférera l’entrée manuelle pour un format ayant peu de valeurs et qui ne soit pas un standard pour plusieurs projets.
  • Dans le cas contraire, de nombreuses valeurs ou des valeurs récurrentes entre études, l’utilisation d’un data set sera plus appropriée.

Dans les deux cas, la procédure format sert. Le nom du format ne doit pas déjà exister parmi les formats actifs. Chaque valeur à convertir ne doit apparaître qu’une fois. Quatre informations sont requises avec les deux méthodes :

  1. Le nom du format
  2. La valeur d’origine
  3. La nouvelle valeur
  4. Le type de données pouvant recevoir ce format (caractère ou numérique).

Deux précisions :

  • Par défaut le type est numérique. Il n’est donc pas obligatoire de le préciser. Seul un changement explicite peut le modifier.
  • Le nom du format ne doit pas avoir plus de 32 caractères, voir 31 pour les formats destinées aux variables caractères, l’espace restant étant réservé au symbole dollar. Sous SAS 8.2, il ne fallait pas plus de 8 et 7 caractères respectivement. De plus, le format ne doit pas se terminer par un chiffre.

1. Le cas du data set transformé en format : en créant un data set avec ces 4 informations, vous pouvez créer un format. Ces variables seront toutes caractères et s’appelleront respectivement :

  1. FMTNAME pour le nom du format,
  2. START pour la valeur d’origine (la valeur stockée dans SAS),
  3. LABEL pour la nouvelle valeur (celle qui sera affichée)
  4. TYPE avec C pour un format s’appliquant à des données caractères et N pour un format numérique.

Le type n’aura besoin d’être précisé que dans le cas de données caractères. Sans précision de votre part, SAS choisira TYPE=N.

Dans l’instruction PROC FORMAT, le mot CNTLIN= introduit le nom du jeu de données.

proc format cntlin=grp;
run;

2. Le cas des données saisies manuellement : après le mot-clé on précisera

  • le type du format via le symbole dollar ($) si caractère seulement
  • le nom du format

Puis sont listées chacune des valeurs d’origine suivies de la nouvelle valeur entre guillemets. Chaque rapprochement est présenté sous forme d’égalité. Les valeurs d’origines seront entre guillemets si elles sont caractères.

Conseil : par soucis de lisibilité, les différentes valeurs du format seront mises l’une en dessous de l’autre.

proc format;
   value grp 10 = ‘Per Protocol’
             11 = ‘Modified Per Protocol’
             20 = ‘Intent-to-Treat’
             21 = ‘Modified Intent-to-Treat’;
   value $ grp ‘PP’   = ‘Per Protocol’
               ‘mPP’  = ‘Modified Per Protocol’
               ‘ITT’  = ‘Intent-to-Treat’
               ‘mITT’ = ‘Modified Intent-to-Treat’;
run;

Pour plus d’informations sur la notation de l’instruction VALUE, reportez vous à l’article intitulé « Proc Format : 7 points forts de VALUE« .

Créer des formats permanents via l’option LIBRARY : jusqu’à présent les formats ne seront valables que le temps de l’exécution de votre programme (batch mode) ou le temps de la session SAS (interactive mode). Pour les sauvegarder sur votre disque dur, et donc de manière permanente, précisez l’endroit via un nom de bibliothèque en tant qu’option LIB= de l’instruction proc format. Par défaut, il s’agit de la bibliothèque temporaire WORK. L’appel d’un format, qu’il soit temporaire ou permanent, dépasse le sujet d’aujourd’hui.

libname sasref ‘C:/sasref’;

proc format lib=sasref;
   *…;
run;

Les formats du bibliothèque donnée sont regroupés dans un fichier nommé CATALOG SAS. Le nom de ce catalogue s’appelle FORMATS à moins qu’un autre nom soit donné dans l’option LIB=. Par exemple, lib=sasref.std créera un fichier et plus particulière un catalogue pour les formats nommé STD et ce catalogue sera sauvegardé dans la bibliothèque LIB.