Archive for the ‘Attributs’ Category

h1

Protégé : Entrer une date avec l’informat ANYDTDTE

juin 6, 2010

Cet article est protégé par un mot de passe. Pour le lire, veuillez saisir votre mot de passe ci-dessous :

h1

Protégé : Valeur formatée utilisée pour définir la macro variable. Attention !

janvier 11, 2010

Cet article est protégé par un mot de passe. Pour le lire, veuillez saisir votre mot de passe ci-dessous :

h1

Ces caractères hexadécimaux non visibles au 1er coup d’oeil

novembre 23, 2009

Lors de l’importation de données d’un fichier Excel, il est fréquent d’importer au passage des caractères spéciaux non visible au premier coup d’œil. Par exemple, on peut trouver des blancs représentés en valeur hexadécimale par le code 20. Certains de ses caractères ressemblent à des blancs mais n’en sont pas. Ils ne disparaîtront donc pas avec une fonction COMPRESS sans troisième paramètre. La valeur hexadécimale de ces caractères est par contre une valeur lisible.

Voici comment afficher votre texte en valeur hexadécimale et ce dans la log ?

1. Illustration du problème

Dans cet exemple, une variable WEBISTE de longueur 25 est présente dans la table HEXFMT. Cette variable contient une observation http://www.sasreference.fr entourée d’un blanc avant et d’un blanc après. Cette valeur est créée ici au moyen de la fonction CAT.

Pour voir la différence entre la valeur de WEBSITE avec et sans un simple COMPRESS, une seconde variable EQUAL indique la valeur YES si les deux résultats sont identiques, NO sinon.

data hexfmt;
length website $25 equal $3;
website=cat(’20’x,‘www.sasreference.fr’,’20’x);
if website=compress(website) then equal=‘Yes’;
else equal=‘No’;
run;

proc print data=hexfmt;
run;

2. Voir les caractères hexadécimaux avec le format HEX

Ici, je vous propose de voir la valeur de la variable WEBSITE au moyen de l’instruction PUT. Il est possible de voir la valeur formatée plutôt que la valeur brute en faisant suivre la variable d’un format. Le format ici sera HEXw. où w est un nombre idéalement de la longueur de la variable fois deux. En effet, les caractères hexadécimaux sont toujours de longueur deux. Si votre texte est de longueur 25, il faudra 50 caractères pour l’afficher en valeur hexadécimale.

data hexfmt;
length website $25;
website=cat(’20’x,‘www.sasreference.fr’,’20’x);
put website= hex50.;
run;

proc print data=hexfmt;
run;

Dans le résultat qui suit, on voit donc le premier caractère de l’observation de WEBSITE a pour code 20. Le second caractère est la lettre W représentée par le code 77, et ainsi de suite.

Lecture complémentaire

h1

Changer la longueur d’une variable avec PROC SQL (instruction ALTER)

avril 27, 2009

En SAS, l’instruction ALTER de PROC SQL a la capacité de changer le libellé d’un data set, modifier le format/informat ou le libellé d’une variable. Mais son principale intérêt réside dans sa capacité à modifier la longueur d’une variable caractère sans changer la position de la variable dans le data set.

1. Comparaison avec deux autres méthodes : PROC DATASETS et l’étape DATA

Alors que PROC DATASETS permet de modifier le format/informat, le libellé d’une variable ou de renommer une variable, il ne permet pas de changer la longueur d’une variable.

Avec une simple étape data, il est possible de modifier la longueur de la variable en ajoutant une instruction LENGTH avant de lire les donnees avec un SET/MERGE… Mais la séquence d’affichage des variables n’est plus respecté. Il faut soit avoir sauvegardé au préalable l’ordre d’affichage (ou l’entrer manuellement, bof !), soit utiliser l’instruction ALTER de PROC SQL…

2. Quelques données pour tester soi-même

* Create two formats SEX and GENDER;
proc format;
value $ sex ‘M’=‘Male’
‘F’=‘Female’;
value $ gender ‘M’=‘Homme’
‘F’=‘Femme’;
run;

*Create a data set named CLASS ;
*based on the SASHELP.CLASS data set ;
*adding the SEX format to the SEX variable;

data class;
set sashelp.class;
format sex sex.;
run;

3. L’instruction ALTER pour modifier la longueur d’une variable

Dans l’instruction ALTER de PROC SQL, le mot-clé MODIFY introduit deux variables SEX et NAME à modifier.

proc sql;
alter table class (label=‘Changes with PROC SQL and ALTER’)
modify sex format=$gender.,
name char(20) label=‘Student Name’;
quit;

Changement le plus intéressant :

  • La longueur de la variable caractère NAME est à l’origine 8. Elle est remplacée par 20.

Quelques changements secondaires :

  • Libellé de data set : Dans l’exemple ci-dessus le data set CLASS a pour libellé ‘Changes with PROC SQL and ALTER’.
  • format de variable : Le format de la variable SEX est à l’origine $SEX. Il est ici remplacé par le format $GENDER.
  • Libellé de variabel : Le libellé de la variable NAME est ajouté. Il s’agit de ‘Student Name’.

A retenir :

  1. Seules les variables caractères peuvent avoir leur longueur changées au moyen de l’instruction ALTER.
  2. Cette instruction permet certe de modifier le format d’un data set. Néanmoins, elle ne permet pas de supprimer tous les formats d’un data set.

Lectures complementaires :

SAS Online DOC

  • The SQL Procedure
h1

Parler français : représenter un nombre 100 987,24

avril 18, 2009

Selon le pays les nombres sont présentés de manière différente. COMMA et COMMAX sont deux formats utilisés par SAS pour représentés les nombres mais ne s’applique pas au cas français. Vous verrez donc comment créer le format qui vous convient avec l’instruction PICTURE de PROC FORMAT.

1. La différence français/anglais

Les francophones présentent les nombres différemment des anglophones sur deux points.

  • Les milliers : Les chiffres des milliers sont séparés par un espace alors que les américains utilisent la virgule
  • Les décimales : Les décimales sont séparées par une virgule en français contre un point en anglais

2. La représentation par défaut de SAS

Par défaut, les nombres sous SAS sont simplifiés comme sur une calculatrice.

  • Les milliers : le seul séparateur est celui des décimales
  • Les décimales : le point fait office de séparateur pour les décimales

Pour une présentation à l’anglais, il faudra appliquer le format COMMA. Il n’existe à ma connaissance qu’une semi version française : le format COMMAX. En effet celui-ci utilise bien la virgule pour séparer les entiers des décimales mais il utilise aussi le point et non le blanc pour séparer les milliers. On préférera donc créer un format avec l’instruction PICTURE.

2. Un exemple

Créer un format : dans le cas présent, les nombres seont affichés jusqu’à 999999,99,  en ajoutant un espace entre les milliers et un virgule pour les décimales.

  • L’usage du 0 : il n’y aura pas de zéro affiché à l’avant du nombre si celui-ci est plus petit que 100000.
  • L’usage du 9 : Les décimales s’afficheront toujours avec deux chiffres après la virgules même si le second chiffre est un zéro.

proc format;
picture commafr other=’000 000,99′;
run;

Appliquer les formats COMMA,  COMMAX et format personnel

Dans cette étape data trois variables sont créées chacune avec une observation.

Dans les trois cas, un format avec une extension 9.2 est ajouté de manière permanente. On indique à SAS que le nombre ne dépassera normalement pas 9 caractères dont 2 pour les décimales.

data fr_en;
format
eg_english comma9.2
eg_semifrench commax9.2
eg_french commafr9.2;
eg_english=100987.24;
eg_semi_french=100987.24;
eg_french=100987.24;
run;

Voir le résultat

eg_english   eg_semifrench   eg_french

100,987.24     100.987,24    100 987,24

La variable EG_ENGLISH (exemple, anglais) reçoit, quant à elle, un format COMMA9.2 pour un affichage à l’américaine/l’anglais.

La variable EG_SEMIFRENCH (exemple,respectant partiellement la syntaxe française) reçoit u nformat COMMAX9.2.

La variable EG_FRENCH (exemple, français) reçoit le format créé manuellement COMMAFR9.2 pour un affichage avec un blanc entre chaque groupe de trois chiffres parmi dans la partie entière et deux chiffres pour la partie décimale.

Lectures complémentaires

SAS Online Doc

  • COMMAw.d Format
  • COMMAXw.d Format
  • PICTURE Statement
h1

Visualiser le contenu d’un catalogue contenant des formats

mars 9, 2009

Les formats sont sauvegardés dans SAS dans des fichiers appelés catalogues (format catalog). Par défaut, tous les formats envoyés dans une même bibliothèque sont sauvegardés dans le même catalogue. Deux questions se posent après :

  • Comment voir la liste des formats présents dans un catalogue ?
  • Comment retrouver le contenu d’un format en particulier ?

1. Créer deux formats dans la bibliothèque SASREF

Pour illuster les deux points qui suivent, sont créés deux formats dans la fichier FORMATS de la bibliothèque SASREF.

  • Le premier format est nommé CNTRY et s’applique à des pays. Il s’agit d’un format alphanumérique (s’applique à du texte).
  • Le second format NY (No/Yes) est un format numérique.
libname sasref  'C:/sasref';

proc format lib=sasref;
   value $ cntry 'FR' = 'France'
                 'DE' = 'Germany'
                 'UK' = 'United-Kingdom';
   value ny      0    = 'Non'
                 1    = 'Yes';
run;

2. Lister les formats présents dans un catalogue avec PROC CATALOG

La procédure PROC CATALOG a la capacité de lister le nom des formats d’un format catalog.

proc catalog c=sasref.formats;
   contents stat;
run;

3. L’option FMTLIB de PROC FORMAT pour voir le contenu des formats

Pour voir les différentes valeurs prises de tous les formats de SASREF (catalogue FORMATS), l’option FMTLIB est joutée dans une procédure PROC FORMAT.

  • Pour ne sélectionner que certains formats en particulier, l’instruction SELECT est à disposition.
  • Inversement, l’instruction EXCLUDE permet d’ôter certains formats de l’affichage.

Dans les deux cas, il faudra préciser si les formats concernées sont numérique ou alphanumérique en ajoutant le symbole dollar ($) devant le nom de chaque format alphanumérique.

proc format library=sasref.formats fmtlib;
   *select $cntry ny;
   *exclude $cntry ny;
run;

Lectures complémentaires :

h1

Modifier un data set sans le lire (formater, renommer, libeller)

mars 5, 2009

Sous SAS, il est possible d’ajouter et supprimer des formats avec une étape data. Cela implique la lecture des données. Pour s’attaquer aux formats sans lire les données, il y a la procédure PROC DATASETS. Quelle est la syntaxe à soumettre ? Quelles sont les autres modifications possibles ? Tout d’abord, vous trouverez le data set servant d’exemple. Puis, la version classique avec l’étape data est présentée suivie de la syntaxe de PROC DATASETS.

1. Les données servant d’exemple, le data set CLASS

Un data set CLASS : Dans cet exemple, un data set CLASS est créé dans la bibliothèque WORK. Il se base sur le data set du même nom situé dans la bibliothèque SASHELP.

Une variable SEX avec un format : Dans ce data set, on trouve une variable nommée SEX. Un format est appliqué sur cette variable de manière permanente (jusqu’à qu’il soit explicitement supprimé ou jusqu’à ce que le data set soit supprimé).

Un format SEX : Le format est également appelé SEX. Il est créé au préalable dans une procédure PROC FORMAT. Les valeurs ‘M’ apparaissent alors sous la forme ‘Male’ (homme) et les ‘F’ apparaissent sous la forme ‘Female’ (femme).

*create a format called SEX;
proc format;
   value $ sex 'M'='Male'
               'F'='Female';
run;
*Create a data set named CLASS ;
*based on the SASHELP.CLASS data set ;
*adding the SEX format to the SEX variable;
data class;
   set sashelp.class;
   format sex sex.;
run;

2. Solution avec une étape data

Nom du data set final : Dans cette étape data (data step), une table SAS (SAS data set) CLASS1 est créée à partir du data set CLASS.

Un label pour le data set : Un libellé (label) est appliqué sur le data set afin d’enrichir la compréhension globale du nouveau data set. Le libellé est « Changes with a Data Step ».

Renommer une variable : la variable WEIGHT (poids) est renommée. Elle s’appelle à la fin WEIGHT_STONE (poids en stone).

Un label pour une variable : un libellé est ajouté à la variable NAME du data set pour faciliter de nouveau la compréhension, de la variable cette fois. Le libellé est « Student Name ».

Traîter les formats : Enfin, l’instruction FORMAT enlève, dans le cas présent, le format de toutes les variables. Si vous voulez enlever seulement le format associé à la variable SEX, utilisez l’instruction en commentaire. Vous pouvez aussi assigner des formats sur d’autres variables avec une instruction FORMAT.

data class1;
   set class (label='Changes with a Data Step' rename=(weight=weight_stone));
   label name='Student Name';
   format _all_;
   *format sex;
 run;

*View the data step result;
proc print data=class1 label;
run;


3. Solution avec la procédure PROC DATASETS

Nom du data set final, instruction CHANGE : A la différence de l’étape data, ici aucun nouveau data set n’est créé. Le data set d’origine est renommé. En d’autres termes, le data set CLASS n’existe plus en tant que tel. L’instruction CHANGE a servi à faire la manipulation.

Un label pour le data set, instruction MODIFY : Un libellé (label) est appliqué sur le data set au moyen de l’instruction MODIFY. Le libellé est « Changes with PROC DATASETS ».

Renommer une variable, instruction RENAME (+MODIFY) : la variable WEIGHT est renommée WEIGHT_STONE au moyen de l’instruction RENAME après avoir utlisé l’instruction MODIFY.

Un label pour une variable, instruction LABEL (+MODIFY) : l’instruction LABEL utlisée en combinaison avec MODIFY ajouter le libellé « Student Name » à la variable NAME.

Traîter les formats, instruction FORMAT (+MODIFY) : Enfin, l’instruction FORMAT enlève, dans le cas présent, le format de toutes les variables.

proc datasets;
   change class=class2;
   modify class2 (label='Changes with PROC DATASETS');
   rename weight=weight_stone;
   label name='Student Name';
   format _all_;
run;
*View the PROC DATASETS result;
proc print data=class1 label;
run;
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

23:59:59 et 23:59:60 avant minuit : pas pour SAS

janvier 5, 2009

Suite aux informations télévisées faisant l’annonce de l’ajoute d’une seconde intercalaire, je me suis intéressée sur l’usage que SAS fait de ces décisions. En effet, les journaux parlent de l’ajout d’une seconde en fin d’année 2008 pour continuer à être en adéquation avec le temps qui s’écoule avant que la terre n’effectue une rotation complète autour du soleil. Du coup, j’ai voulu savoir si SAS incluait ce changement dans sont format DATETIME.

1. A l’origine de l’histoire

Les secondes intercalaires (leap second en anglais) : les secondes intercalaires, tel est le nom données à ces secondes ajoutées de temps en temps en fin d’année.

Quelques sources d’information : Qu’il s’agisse du monde.fr ou du timesonline.co.uk, tous nous parlent de sa dernière incursion dans notre horloge du temps. Wikipedia nous parle rapidement de l’organisme international qui prend cette décision : le service international de la rotation de la terre et des systèmes de référence (IERS ou Internation Earth Rotation and Reference Systems Service www.iers.org)

23 secondes d’ajoutées avant d’atteindre le 1er janvier 2009 : Cette année on a compté 23:59:59, 2:59:60 et seulement après 00:00:00 et ce pour la 23ème fois. 1972 est la première année où est intervenu cette addition.

Des changements prévisibles peut de temps à l’avance : Le prochain ajout n’est pas encore confirmé avec certitude. On parle de 2012 ou 2013. Ceci explique alors en partie pourquoi  SAS n’inclut pas ces secondes dans son format DATETIME .

2. Tester avec un petit exemple sous SAS

Dans cet exemple, on crée deux variables DT1 et DT2.

data one;
  dt1='31DEC2008:23:59:59'dt;
  dt2='01JAN2009:00:00:00'dt;
run;

Après un simple PROC PRINT, on voit que SAS compte une différence d’une seconde et non de deux secondes entre les deux valeurs.

proc print data=one;
run;
      dt1           dt2

1546387199    1546387200

Si un format DATETIME. est appliqué sur ces donnés, SAS reste cohérent dans son choix et considère DT2 comme étant déjà en 2009.

proc print data=one;
  format dt1 dt2 datetime.;
run;
      dt1                 dt2

31DEC08:23:59:59    01JAN09:00:00:00
h1

4 étapes de base pour créer un data set avec PROC SQL

septembre 18, 2008

La procédure SQL disponible sous SAS est une alternative à l’étape data (data step en anglais) dans de nombreuses situations. La syntaxe est dérivée du langage SQL abbréviation de Structured Query Language. Il s’agit donc de faire une requête (query) auprès de SAS pour extraire une information à partir d’un ou plusieurs jeux de données.

Voici donc ici l’occasion de voir la syntaxe de base pour créer un data set à partir d’un autre data set.

1. Début et fin : les instructions PROC SQL et QUIT.

Pour débuter une procédure SQL, il faut taper une instruction commençant par PROC SQL et finir avec une instruction QUIT (et non RUN). Entre ces deux instructions, une nouvelle instruction créera le nouveau data set.

Il est possible d’avoir autant d’instructions entre PROC SQL et QUIT que voulu. Dans la suite, seul un data set sera créé. Il n’y aura q’une seule instruction.

proc sql;
*instruction 1: créer un premier data set par exemple;
*instruction 2 : créer un second data set par exemple;

quit;

2. Lister les variables après SELECT

Un mot introductif, SELECT : l’instruction centrale débute avec le mot-clé SELECT. A la suite figurent toutes les variables à garder.

La virgule comme délimiteur : A la différence d’un data step, la procédure SQL utilise la virgule et uniquement la virgule comme délimiteur entre les noms de variables.

proc sql;
select age, height, weight
from sashelp.class;
quit;

Renommer une variable avec AS : Au stade de la sélection des variables, il est possible d’assigner un nom différent de celui d’origine en se servant du mot AS.

Dans l’exemple ci-dessous, la variable d’origine s’appelle HEIGHT. Après cette variable s’appelle TAILLE.

proc sql;
select height as taille
from sashelp.class;
quit;

Ajouter des attributs : Dans un data step, les instructions ATTRIB, LABEL, FORMAT, INFORMAT et LENGTH sont disponibles pour définir les attributs d’une variables. Avec PROC SQL, les attributs sont à donner après le nom de chaque variable.

Exemple : Dans cet exemple, toutes les variables reçoivent un label. De plus, la longueur des variables NAME (caractère) et AGE (numérique) sont redéfinies.

proc sql;
select name length=15 label=‘Nom’,
age length=4,
height label=‘Taille’,
weight label=‘Poids’
from sashelp.class;
quit;

Note : Dans un data step, un symbole dollar ($) est obligatoire pour définir la longueur des variables caractères, alors qu’avec PROC SQL, ce symbole n’est pas demandé.

Lister toutes les variables : pour lister toutes les variables du data set source rapidement, le symbole étoile (asterik) fera le travail. Rien n’empêche d’ajouter d’autres variables à la suite.

Exemple : Dans l’exemple ci-dessous, toutes les variables du data set CLASS situé dans la bibliothèque SASHELP sont gardées. De plus, pour chaque observation, une variable EXTRA prend la valeur ‘TEST’.

proc sql;
select *, ‘TEST’ as extra
from sashelp.class;
quit;

3. Définir le data set source avec le mot-clé FROM

Dans chacun des exemples ci-dessus, un data set source a été introduit pas le mot-clé FROM.

4. Assigner un nom de data set avec CREATE

Par défaut aucun data set n’est créé : Avec un data step, il faut dans un premier temps créer le data set pour pouvoir ensuite l’imprimer. Avec PROC SQL, les informations sont automatiquement envoyées dans la fenêtre de destination (OUTPUT par exemple) si aucun nom de data set n’est donné avant la sélection des variables.

La structure de début de l’instruction centrale : Pour donner un nom de data set, il faut commencer l’instruction centrale par :

CREATE TABLE mon_nom_de_table AS…

Pourquoi un mot-clé TABLE ? : La présence du mot-clé TABLE se justifie par le fait que SAS est capable de créer plusieurs types de fichiers : les SAS data sets appelés aussi TABLE, et les VIEW. Pour débuter seules les TABLES nous intéressent, l’usage des VIEW étant beaucoup plus occasionnel.

Par ailleurs, sachez que les options du data set vues dans un data step (DROP, KEEP, RENAME, WHERE…)  s’appliquent également dans la PROC SQL mais seulement une fois le nouveau data set créé. Pour les curieux, il y a l’article « Je garde ou je jette ? les variables« .

proc sql;
create table class (drop=age) as
select *, ‘TEST’ as extra
from sashelp.class;
quit;

Depuis la version SAS 9, SAS demande explicitement d’éviter de créer un data set portant le même nom que le data set source. Si vous le faites, un message apparaîtra dans la log.

WARNING: This CREATE TABLE statement recursively references the target table. A consequence of this is a possible data integrity problem.

h1

Supprimer des formats

août 7, 2008

Après avoir présenté dans l’article « 2 méthodes pour de nouveaux formats » comment créer un format de manières temporaire et permanente, nous allons voir comment les supprimer.

Rappel : les formats SAS sont sauvegardés dans un fichier nommé catalogue pour les formats (format catalog). Il peut exister plusieurs fichiers ayant des noms différents selon l’information donnée lors de la création dans l’option LIB= de PROC FORMAT. Si aucun nom en particulier n’a été donné lors de la création, alors le catalogue pour les formats s’appelle FORMATS et est sauvegardé temporairement dans la bibliothèque WORK.

1. Créer deux formats pour l’exemple

Dans un premier temps, pour illustrer le code, trois formats sont créés dans le catalogue nommé FORMATS de la bibliothèque WORK. Ces formats s’appellent NY, SEX et GENDER. Les deux premiers sont numériques, le troisième s’applique à des variables caractères.

Dans cet exemple les éléments mis en commentaire sont les valeurs implicites, celles que SAS utilise par défaut.

proc format; *lib=work.formats;
   value ny        1 = ‘NO’
                   2 = ‘YES’;
   value sex       1 = ‘Male’
                   2 = ‘Female’;
   value $ gender ‘M’ = ‘Male’
                  ‘F’ = ‘Female’;
run;

2. Supprimer un à un les formats du catalog

Avec la procédure PROC CATALOG, les formats NY et GENDER sont supprimés du catalogue FORMATS. Il restera le format SEX dans le catalogue. Il est impératif ici de nommer le nom du catalogue (FORMATS) et la bibliothèque où il est sauvegardé avec l’option CATALOG=.

Dans l’instruction DELETE figurent le nom des formats à supprimer. Le type d’entrée (entry type ou ET) est à préciser.

  • Dans le premier cas, les formats NY et GENDER sont de type différent. Chacun d’eux est suivi du type de l’entrée entre parenthèses. L’un est numérique (ET=FORMAT) et l’autre est caractère (ET=FORMATC).
  • Si tous les formats listés sont du même type, il est possible d’utiliser l’option ET= après une barre inclinée. Les formats AGE et SEX sont tous les deux numériques. L’option ET=FORMAT suffit.

proc catalog catalog=work.formats;
   delete ny (et=format) gender (et=formatc);
   *delete age sex / et=format;
run;

3. Supprimer le catalogue en entier avec tous ces formats

La procédure PROC DATASETS permet de supprimer un catalogue contenant des formats. Pour se faire, il faut d’abord préciser le type de fichier avec l’option MEMTYPE, la valeur par défaut étant DATA. Par défaut SAS recherchera le catalogue dans la bibliothèque WORK à moins de préciser une autre bibliothèque. Le nom du fichier catalogue contenant les formats est donné dans l’instruction DELETE

proc datasets memtype=catalog;*lib=work;
   delete formats;
run;

Annexe : cet exemple est le même que précédemment à une exception près.

  • D’une part, le format catalogue est maintenant permanent puisqu’il est sauvegardé dans la bibliothèque SASREF et non WORK.
  • D’autre part, il est sauvegardé avec un nom choisi par le programmeur (VERO) et non FORMATS.

libname sasref ‘C:/sasref’;

proc format lib=sasref.vero;
   value ny        1 = ‘NO’
                   2 = ‘YES’;
   value sex       1 = ‘Male’
                   2 = ‘Female’;
   value $ gender ‘M’ = ‘Male’
                  ‘F’ = ‘Female’;
run;

proc catalog catalog=sasref.vero;
   delete ny (et=format);
run;

proc datasets lib=sasref memtype=catalog;
   delete vero;
run;

h1

Créer une date SAS de 3 manières

avril 28, 2008

Cet article a été réécrit. Il est disponible sur programmeur-pro.com

 

Le langage SAS utilise sa propre échelle de temps. Dans un premier temps, je vous rappèle comment est définie une date, une heure et une combinaison de l’heure et du jour. Puis, je vous propose trois alternatives pour convertir ou créer ces valeurs.

1. Rappel sur la notion de date SAS et datetime SAS

Date : Une date SAS est un nombre entier égal au nombre de jours écoulés depuis le 1er janvier 1960. Les dates avant 1960 sont donc négatives. Le 1er janvier 1960 est égal à zéro. Ainsi la différence entre deux dates SAS est un nombre de jours.

Time : Un time SAS est un nombre représentant le nombre de secondes écoulées depuis minuit. Il varie entre 0 et 86400 (60 secondes * 60 minutes *24 heures). La différence entre deux times SAS est un nombre de secondes.

Datetime : Un datetime SAS est un nombre représentant le nombre de secondes écoulées depuis le 1er janvier 1960. Ce nombre aura une valeur décimale si on utilise des dixièmes de secondes. Mais ceci est rare. La différence entre deux datetimes SAS est donc un nombre de secondes.

Avantages : Ces nombres facilitent les calculs sur le temps écoulé. De plus, les fonctions de temps SAS ont besoin de ces valeurs. Ainsi la fonction MONTH extrait le mois d’une date SAS (SAS Online Doc. : Liste des fonctions DATE).

Inconvénient et parade : pour lire ces dates/time/datetime, on préfère les voir en langage humain. Soit un format est appliqué sur la valeur numérique, soit une variable caractère est créée avec une fonction PUT et le nom du format. Ce sujet ne sera pas détaillé dans cet article.

SAS Online Doc : About SAS Date, Time and Datetime Values

2. Les fonctions MDY et DHMS

Créer une date avec la fonction MDY : La fonction MDY crée une date SAS. Elle a besoin de trois informations : le mois, le jour et l’année. Aux Etats-Unis, le mois apparaît en premier dans la date, suivi du jour et enfin du mois. Les trois paramètres de cette fonction sont donc des valeurs numériques. Le langage SAS ayant été créé aux Etats-Unis, l’ordre des paramètres de la fonction MDY est le même. Le nom de la fonction est lui-même parlant : M pour month, D pour day et Y pour year.

visit_dt = mdy(visit_m,visit_d,visit_y);

Créer un time avec la fonction HMS : la fonction HMS retourne un time SAS. Elle est composée de l’heure, des minutes et des secondes.

visit_hour = hms(vist_hr,visit_min,visit_sec);

Créer un datetime avec la fonction DHMS : Créer une datetime avec la fonction DHMS : la fonction DHMS créer une datetime SAS. Elle a 4 paramètres : la date SAS, l’heure, les minutes et les secondes.

visit_time = dhms(visit_dt, vist_hr,visit_min,visit_sec);

3. Lire un texte et le convertir en date/time/datetime

On peut lire une valeur texte et demander à SAS de l’interpréter comme une date. Il faut alors que ce texte suivre une des structures répertoriées par SAS. On parle d’informat. En voici la liste complète : SAS Online Doc., Informats by Category. La fonction INPUT est alors utilisée. Le premier paramètre est soit une valeur texte entre guillemets, soit une variable texte.

DATE informat : Une des notations les plus utilisées pour lire des dates est le jour suivi des trois premières lettres du mois en anglais et enfin de l’année exprimée avec 4 chiffres. La longueur totale étant de 9 caractères, l’informat s’appelle date9. DATE. a pour valeur par défaut 7. Cela impose une année à 2 chiffres.

jour = input(’25NOV1952′,date9.);

nov_dt = input(’25NOV52′,date7.); *attention à l’option globale YEARCUTOFF qui décidera s’il s’agit de 1952 ou 2052 par exemple (voir la note plus bas);

TIME informat : L’informat TIME. a pour longueur par défaut 8. Donc TIME. et TIME8. sont identiques.

heure = input(’08:15:00′,time.);

DATETIME informat : L’informat DATETIME. a pour longueur par défaut 18. Ainsi DATETIME. et DATETIME18. sont identiques.

jour_heure = input(’25NOV1952:08:15:10′,datetime.);

Note sur l’option YEARCUTOFF :

a. Identifier la valeur actuelle de YEARCUTOFF : pour savoir quelle est l’année de YEARCUTOFF, consultez la log après avoir soumis le code suivant :

proc options;
run;

b. Changer le yearcutoff : pour alterner cette valeur, utilisez l’instruction globale OPTIONS et le mot-clé YEARCUTOFF.

options yearcutoff=1950;

c. Interprétation : avec une YEARCUTOFF de 1920,

  • une année inférieure à 20 sera interprétée comme égale à une année 2000 :  20xx.
  • Une année supérieure ou égale à 1920 sera interprétée comme une année 1900 : 19xx

4. Ecrire manuellement quelques valeurs date/time/datetime

Une manière rapide de créer une date SAS si, et seulement si, on a très peu de valeurs à entrer est de faire suivre la valeur texte de d, t ou dt selon qu’il s’agisse d’une date, d’un time ou d’un datetime.

x = ‘ 25NOV1952’d;

x = ’08:15:00’t;

x = ’25NOV1952:08:15:10’dt;

SAS Online Doc. : SAS Constants in Expressions

h1

Convertir une variable caractère en numérique et inversement

avril 21, 2008

Cet article est maintenant réécrit. Vous le retrouvez sur www.programmeur-pro.com.

Passer d’une variable numérique à une variable caractère ou inversement est fréquent en langage de programmation SAS. Les fonctions INPUT et PUT permettent de changer ainsi le type de la variable. Dans un premier temps, je vous propose deux exemples pour illustrer les deux situations. Dans un second temps, on verra deux emplois supplémentaires de la fonction PUT : ajouter des zéros avant et après le nombre, et passer d’une valeur caractère à une autre valeur caractère.

Exemples d’application : dans la vie courante, il est fréquent de créer une variable texte à partir de plusieurs autres. Dans le lot, il y a souvent une variable numérique. Celle-ci doit être convertie en texte avant la concaténation. A l’inverse, on peut vouloir extraire le chiffre d’une chaîne de caractère et le sauvegarder dans une variable numérique.

Note : Dans un data step, on est obligé de créer de donner un nom différent à la variable d’origine et à la nouvelle variable. Il est alors courant de renommer au préalable la variable d’origine pour pouvoir utiliser son nom pour la nouvelle variable. Ensuite, la variable d’origine est supprimée. Dans une procédure SQL, le même nom peut être utilisé.

1. Du caractère au numérique et inversement

La fonction INPUT est composée de deux paramètres : la variable texte ou directement la chaîne de caractère d’un côté, l’informat de l’autre.

Du caractère au numérique : ici, on indique à la machine qu’il faut lire la variable d’origine comme une variable texte pouvant atteindre une longueur de 16 caractères. Pour cela on utilise l’informat $16. On peut aussi choisir un informat $CHAR. : ici $CHAR16. (SAS Online Doc. : INPUT Function, Informats by Category)

data char_to_num;
  x_char = ‘123456789.123456’;
  x_num = input(x_char,$16.);
*x_num = 123456789.123456;
run;

Note : Pensez à ajouter un format sur la variable numérique si vous ne la lisez pas intégralement dans votre output.

Du numérique au caractère : dans l’exemple ci-dessous, on indique que la valeur à créer sera numérique avec 16 chiffres/point dont 6 après la virgule. C’est l’information donnée par le format numérique 16.6. Bien sûr, on peut avoir la longueur nombre à convertir peut-être plus petit sans risquer d’affecter la valeur. Une autre possibilité est d’utiliser le format BEST16. Si aucun nombre n’est précisé (BEST.) cela revient à BEST8. SAS cherche alors la meilleure réponse possible permettant d’entrer 8 chiffres/point. Les décimales pourront être tronquées s’il n’y a pas assez de place, voir les entiers.

data num_to_char;
  y_num = 123456789.123456;
  y_char = put(y_num,16.6);
*y_char = ‘123456789.123456’;
run;

2. Les plus de la fonction PUT

Ajouter des zéros aux extrémités du nouveau texte : le format z. permet de remplacer les espaces vides par des zéros. Dans l’exemple ci-dessous, la nouvelle variable aura une longueur de 8 caractères. Les deux derniers seront les chiffres après la virgule. Comme il n’y en a qu’un seul dans la variable d’origine, un zéro sera ajouté à la fin. Il reste deux espaces en début à remplir avec des zéros.

data num_char_zero;
   z_num = 123.1;
   z_char = put(z_num,z8.2);
  *z_char = ‘00123.10’;
run;

Passer d’une valeur caractère à une autre : la valeur caractère d’origine peut aussi être du texte et non des chiffres. Dans cette situation, la nouvelle variable prend la valeur d’un format caractère souvent défini par le programmeur.

proc format;
  value $cntry
  FR = ‘France’
  LU = ‘Luxembourg’
  CH = ‘Suisse’;
run;

data char_to_char;
  a1_char=’LU’;
  a2_char=put(a1_char,$cntry.);
  *a2_char=’Luxembourg’;
run;

h1

Arrondir ses chiffres avant d’appliquer un format

mars 31, 2008

Gérer l’affichage des pourcentages et des décimales avec SAS : tel est la thématique de cet article. Les formats permettent de présenter les données d’une manière un peu plus élégante et parlante. On peut ainsi n’afficher que les deux derniers chiffres après la virgule, ajouter un symbole pourcentage. Mais les formats vont couper le chiffre plutôt que l’arrondir si PICTURE avec l’option ROUND n’est pas utilisé.

1. Arrondir un nombre avec la fonction ROUND : la fonction ROUND permet d’arrondir les nombres soit à la décimale près soit à l’entier (ou son multiple) près. La fonction dispose de deux paramètres : la variable d’origine et la précision de l’arrondi.

Arrondir à deux chiffres après la virgule :

x1= round (orig,0.01);

Arrondir tous les 10 :

x1= round (orig,10);

Ainsi dans le premier exemple, si ORIG=17.016, l’arrondi au centième (X1) est égal à 17.02. Dans le second cas, l’arrondi (X2) = 20.

2. Créer un PICTURE format : l’instruction PICTURE est très pratique pour afficher les formats dans un rapport.

Dans l’exemple qui suit, le nombre aura au maximum trois chiffres pour la partie entière et deux chiffres pour la partie décimale. Si la partie entière n’a qu’un chiffre, seul celui-ci apparaîtra. Remplacez le 0 des dizaines par un 9 et le chiffre zéro précédera le pourcentage s’il est inférieur à 10 %.

proc format;
picture pct
low-high=‘009.99 %’;
run;

Cette syntaxe dispose de l’option ROUND. C’est très pratique pour à la fois arrondir un chiffre, apposer un symbole % et avoir un zéro pour les chiffres après la virgule quand le chiffre n’est pas entre 1 et 9.

proc format;
picture pct_rd (round)
low-high=‘009.99 %’;
run;

3. Créer un texte avec un pourcentage arrondi à deux décimales : le code qui suit utilise 4 valeurs pour illustrer la différence entre la fonction ROUND, le FORMAT.

orig     fmt     rnd   solution1 solution2

21.200  21.20 %  21.20   21.20 %   21.20 %
6.333   6.33 %   6.33    6.33 %    6.33 %
84.367  84.36 % 84.37   84.37 %   84.37 %
13.362  13.36 %  13.36   13.36 %   13.36 %

data rnd_fmt;
set rnd_fmt;
fmt       = put(orig,pct.);
rnd       = round(orig,0.01);
solution1 = put(round(orig,0.01),pct.);
solution2 = put(orig,pct_rd.);
run;

Annexe :

data rnd_fmt;
input orig;
datalines;
21.200
6.333
84.367
13.362
;
run;

h1

Proc Format : 7 points forts de VALUE

février 14, 2008

Dans un article précédent, nous avons vu les deux notations pour écrire de nouveaux formats : via un jeu de données, via l’instruction VALUE de PROC format. A présent je vous propose des précisions sur l’instruction VALUE, afin de pouvoir mettre le même texte sur plusieurs valeurs.

1. Virgules pour des données fixes : énumérer les valeurs les unes après les autres en les séparant par des virgules : -1,-2, 1, 2.

proc format;
   value in_ex
      -1,-2,1,2 = 'Inclus'
      0         = 'Exclus';
run;

2. Trait d’union pour les intervalles : fournir un intervalle entre deux valeurs fixes, bornes incluses, avec un trait d’union : 0-1 pour les valeurs entre zéro et un, ou encore -5 – -1 pour les valeurs négatives entre moins cinq et moins un.

proc format;
   value intrvl
      0-1    = 'Entre 0 et 1, bornes inclus'
   value neg_pos
      -5--1  = 'Valeurs négatives'
      0      = 'Zéro'
      1-5    = 'Valeurs positives';
run;

3. Signe inférieur pour exclure les bornes d’un intervalle : fournir un intervalle entre deux valeurs fixes et exclure les bornes en utilisant le signe inférieur : 0 < – < 1.

proc format;
   value intrvl
      0 <- <1 = 'Entre 0 et 1, bornes exclus';
run;

4. LOW pour définir la borne inférieure d’un intervalle : prendre toutes les valeurs en dessous d’une valeur donnée grâce au mot-clé low : low-60.

proc format;
   value inf_lim
      low-0    = 'Inférieur ou égal à zéro';
run;

5. HIGH pour définir la borne supérieure d’un intervalle : prendre toutes les valeurs en dessus d’une valeur donnée avec high : 0-high

proc format;
   value sup_lim
      0-high    = 'Supérieur ou égal à zéro';
run;

6. OTHER pour lister les valeurs restantes : enfin il vous reste le mot-clé other pour les données restantes.

proc format;
   value autre
      0-1   = 'Negative values'
      other = 'Pas dans l'intervalle';
run;

7. Définir un format à partir d’un autre format : le mot-clé OTHER en combinaison avec les crochets [] permet de créer un format à partir d’un format existant. Notez que vous pouvez lister autant d’instructions value que vous le souhaitiez dans une seule procédure format.

proc format;
   value ny
   0     ='NO'
   1     ='YES;
   value nybis
   .     = 'MISSING'
   .A    = 'Not Applicable'
   other = [ny.];
 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.