Archives pour mai 2008

h1

La base de la jointure de deux data sets avec MERGE

mai 29, 2008

Tout d’abord, une jointure c’est quoi ? Une jointure est le rapprochement de plusieurs data sets pour n’en former plus qu’un. Maîtriser les jointures est primordial pour un programmeur. On peut citer deux raisons : fusionner des données est un travail récurrent ; une mauvaise jointure a des conséquences sur toute la suite du travail. La syntaxe de SAS peut paraître triviale. L’important est de connaître ses données et de savoir clairement ce qu’on attend à la fin. Prenez le temps qu’il faut pour acquérir cette compétence, vous ne le regretterez pas.

Les jointures peuvent être définies selon trois critères.

  • Ajouter des variables : on distingue d’un côté les jointures où le but principal est d’empiler des observations les une en dessous des autres (SET, UNION,…) des jointures où le premier but est d’ajouter des variables (MERGE, JOIN,…).
  • Avoir des variables communes aux deux data sets : selon les situations des variables communes doivent être précisées. Parfois, néanmoins, le but est différent et aucune variable commune n’est listée. On s’intéressera au cas le plus fréquent : des variables communes listées.
  • Jointure dans un data set : enfin la syntaxe du data step (SET, MERGE) se distingue de celle de la procédure SQL. Dans le cas présent, on se concentrera sur celle du data step.

Objectif : En résumé, il s’agira de présenter la base de la jointure MERGE, propre au data step, où les variables communes sont listées dans une instruction BY. Voici donc pour commencer trois des quatre situations de base du MERGE avec des variables communes.

Exemples : Dans les exemples qui suivent, il y a deux data sets à chaque fois. Le premier a pour variable A, X, Y, et le second a les variables X, Y et B. Les variables X et Y sont les variables communes. Le résultat de la jointure est un data set nommé FINAL. En fin d’article, vous trouverez le code pour créer rapidement ces différents data sets sources.

1. Différents noms de jointure : si on a deux data sets qui ont une ou plusieurs variables communes, on aura le choix entre plusieurs jointures :

  • ONE-TO-ONE : si dans chaque data set, cette variable (ou la combinaison de ces variables) n’apparaissent qu’une fois, la jointure des deux data sets sera une jointure ONE-TO-ONE.
  • ONE-TO-MANY ou MANY-to-ONE : si un des deux data sets a pour cette variable plusieurs fois la même valeur, la jointure s’appellera ONE-TO-MANY ou MANY-to-ONE.
  • MANY-TO-MANY : maintenant si dans chacun des deux data sets il y a des doublons pour les variables communes, il s’agit d’une jointure MANY-TO-MANY.

2. Des doublons dans aucun des data sets

Dans l’exemple ci-dessous, chacune des combinaisons x=,y= n’apparaît qu’une fois. Une jointure des deux data sets sera ONE-TO-ONE.

Avant deux data sets

   frst_one      second_one
 a    x    y     x    y    b
 1    A    B     B    D    2
 3    C    D     A    B    4
 5    B    D     E    F    6

Après un seul data set

      final
 a    x    y    b
 1    A    B    4
 3    B    D    2
 5    C    D    .
 .    E    F    6

Lister plus de deux data sets ONE-TO-ONE-TO-ONE-TO…: dans ce cas particulier, il est possible de lister plus de deux de data sets ayant tous des BY variables uniques.

2. Des doublons parmi les variables communes dans un et un seul des data sets.

S’il y a des doublons dans un des deux data sets, des lignes supplémentaires seront ajoutées. Et les observations de l’autre data sets seront dupliquées pour chaque doublons.

MANY-TO-ONE : Ici, c’est le premier data set qui a des doublons. La valeur b=4 est répétée pour chacun des x=A, Y=B du premier data set.

Avant deux data sets

  frst_many        second_one
 a    x    y      x    y    b
 1    A    B      B    D    2
 2    A    B      A    B    4
 9    A    B      E    F    6
 3    C    D
 5    B    D

Après un seul data set

      final
 a    x    y    b
 1    A    B    4
 2    A    B    4
 9    A    B    4
 3    B    D    2
 5    C    D    .
 .    E    F    6

ONE-TO-MANY : A l’inverse, ici, c’est le second data set qui a des doublons. C’est donc la valeur a=1 qui est répété pour chaque x=A, Y=B et a=5 pour chacune des combinaisons x=B, y=D du second data set.

Avant deux data sets

  frst_one       second_many
 a    x    y     x    y    b
 1    A    B     B    D    2
 3    C    D     B    D    8
 5    B    D     A    B    3

                 A    B    4
                 E    F    6

Après un seul data set

      final
 a    x    y    b
 1    A    B    3

 1    A    B    4
 5    B    D    2
 5    B    D    8
 3    C    D    .
 .    E    F    6

Après la jointure, il est possible de garder seulement certaines observations. Cela fera l’objet d’un autre article. Jeudi prochain, nous verrons le cas particulier du MANY-TO-MANY.

3. En langage SAS, cela donne quoi?

Quelque soit le type de jointure parmi les trois listées (ONE-TO-ONE, MANY-TO-ONE et ONE-TO-MANY) la syntaxe du MERGE est la même. Je choisi dans cet exemple de nommer le premier data set FRST_… et l’autre SECOND_… Le data set créé s’appelle FINAL. Vous trouverez en bas de l’article le code pour créer ces data sets selon qu’il y a des doublons (FRST_MANY, SECOND_MANY) ou pas (FRST_ONE, SECOND_ONE).

L’instruction BY implique que les données soient préalablement triées de la même manière. Si vous êtes sûr que l’ordre est bon, vous pouvez vous passer d’un tri. Mais c’est rare. Du coup, on a le choix entre un PROC SORT ou un ORDER BY (“GROUP BY”) dans une PROC SQL. 

proc sort data=frst_…;
   by x y;
run;

proc sort data=second_…;
   by x y ;
run;

data final;
   merge frst_… second_…;
   by x y;
run;

Annexe : créer les data sets pour tester les jointures

data frst_one;
   input a x $ y $;
   datalines;
1 A B
3 C D
5 B D
;
run;

data second_one;
  input x $ y $ b;
   datalines;
B D 2
A B 4
E F 6
;
run;

data frst_many;
   input a x $ y $;
   datalines;
1 A B
2 A B
9 A B
3 C D
5 B D
;
run;

data second_many;
   input x $ y $ b;
   datalines;
B D 2
B D 8
A B 3
A B 4
E F 6
;
run;

h1

Mes 1ers pas avec ODS TAGSETS.EXCELXP (3/3)

mai 26, 2008

L’ODS TAGSETS.EXCELXP, alternative au PROC EXPORT, permet de créer des fichiers Excel à partir de données SAS. Afin de personnaliser ce fichier, nous avons vu dans un premier article la syntaxe de PROC REPORT. Puis dans un second article, le PROC TEMPLATE a permis de modifier des couleurs, polices et marges du document à imprimer. Pour ce dernier article sur “Mes premiers pas avec l’ODS TAGSETS.EXCELXP”, il s’agit de voir les options de l’instruction ODS.

ods tagsets.excelxp file = ‘C:/excel/mon_nouveau_fichier.xls’
style = vero_xls
options (…);

1. Personaliser la feuille de calcul

1.1 Donner un nom à une feuille : pour personnaliser le nom de la feuille de calcul, il faut ajouter l’option SHEET_NAME=’Mon nom de feuille’.

ods tagsets.excelxp options (sheet_name=‘Mon nom de feuille’);

1.2 Figer la première ligne contenant les titres de colonnes : sous Excel, on peut figer les x premières lignes de sorte que quelque soit la ligne consultée, la ligne figée reste visible. Sur le même principe, la première ligne contenant le nom des colonnes peut être figé grâce à l’option FROZEN_HEADER=.

ods tagsets.excelxp options (frozen_headers = ‘Yes’);

1.3 Ajouter un filtre aux colonnes : sous Excel, un filtre est une petite flèche qui apparaît dans la première ligne d’une colonne donnée. En cliquant dessus, on voit apparaître toutes les valeurs prises par la colonne. L’utilisateur peut ainsi choisir de ne faire apparaître que les lignes ayant une valeur ou un groupe de valeurs données. Pour ajouter ce type de filtre à toutes les colonnes du fichier Excel avec ODS, il y a l’option AUTOFILTER=.

ods tagsets.excelxp options (autofilter = ‘All’);

1.4 Créer plusieurs feuilles dans un seul fichier Excel

Pour créer plusieurs feuilles dans un fichier Excel unique, il faut dans un premier temps, définir les données communes aux multiples feuilles : nom du fichier Excel et Style.

ods tagsets.excelxp file = ‘C:/excel/mon_nouveau_fichier.xls’
style = vero_xls;

Dans un deuxième temps, on actualise cette information pour chaque feuille en précisant les options SHEET_NAME .

ods tagsets.excelxp options (sheet_name = ‘Feuille 1′);
proc report…;
run;
ods tagsets.excelxp options (sheet_name = ‘Feuille 2′);
proc report…;
run;
ods tagsets.excelxp close;

2. Agir sur le document à imprimer

2.1 Faire les titres de colonnes sur toutes les pages : l’option ROW_REPEAT= va permettre de répéter le titre des colonnes sur chacune des pages à imprimer.

ods tagsets.excelxp options (row_repeat = ‘header’);

2.2 Modifier l’orientation de la page : par défaut l’orientation de la page à imprimer est orientée portrait (portrait). Pour changer en Paysage (landscape), il faut le préciser avec l’option ORIENTATION=.

ods tagsets.excelxp options (orientation = ‘landscape’);

Cette liste des options est loin d’être exhaustive. Vous pouvez vous reporter à la page du support SAS pour avoir la liste complète de options.

Références : la documentation sur les ODS TAGSETS.EXCELXP reste encore très limitée. Voici néanmoins quelques liens :

h1

Empiler des data sets

mai 22, 2008

Ajouter des lignes à un data set en utilisant celles d’un autre data set, c’est possible avec SAS. Selon les particularités du data set, une ou plusieurs méthodes sont disponibles. Trois data sets en fin d’articles sont disponibles pour tester les différentes méthodes.

1.  L’instruction SET dans un data step offre probablement le plus de flexibilité 

Groupées les données : La souplesse de l’instruction SET vient notamment de l’instruction BY. Sans cette instruction, toutes les données du premier data set sont lues et ajoutée au data set final. Puis, seulement après les données du data set suivant sont ajoutées. Si on veut que les lignes apparaissent dans un ordre précis défini par une instruction BY, les données doivent être préalablement triées dans cet ordre. 

Deux data sets et plus : en outre, plus de deux data sets peuvent êtes mis bout à bout. Les premières données qui s’afficheront seront celles du premier data set listé dans l’instruction SET.

Autorise un nombre de variables différent : A l’exception des variables listées dans une instruction BY, les data sets n’ont pas besoin d’avoir les même variables. La variable présente dans seulement certains data sets sera présente au final. Des valeurs manquantes seront ajoutées si besoin.

Même longueur et type pour les variables communes : Il est néanmoins important que certains attributs des variables présentes dans plusieurs data sets soient identiques.

  • Longueur : SAS utilisera la longueur de la première variable lue. Si la longueur de la seconde variable est plus grande, les valeurs, textes notamment, seront tronquées.
  • Type numérique ou caractère: L’attribut sur le type de la variable est aussi essentiel. SAS aura des problèmes en lisant à la fois des variables numériques et caractères du même nom.
  • Nom de variable : Si les variables ont des noms différents. Il est possible de les renommer préalablement avec l’option RENAME.

Un nom de data set au choix : par ailleurs, on peut donner un nouveau nom au data set créé

La syntaxe du data set toujours disponible : enfin, les mêmes manipulations qu’avec une instruction SET avec un seul data set peuvent êtes effectuées. Les options (IN=) sont disponibles pour établir des conditions basées sur le data set source.

data seq_all;
   set seq1 seq2 seq3;
run;

SAS Online Doc : The SET Statement

2. La procédure DATASETS (et PROC APPEND) peut s’avérer plus performante

La procédure DATASETS dispose de l’instruction APPEND. Cette procédure est plus récente que sa jumelle PROC APPEND. Elle propose d’autres instructions fortement utiles comme COPY et DELETE.

  • Nombre de data sets d’entrée: Ici, il est impératif d’avoir deux et seulement deux data sets pour une jointure donnée.
  • Structure des data sets d’entrée : Chaque data set doit avoir les mêmes variables.
  • Nom du data set de sortie : Le data set final portera le nom du data set listé dans la base.
  • Performances : APPEND pourra s’avérer plus performant si le data set défini dans la base est large. En effet, dans ce dernier cas, seul les observations du deuxième data set sont lues intégralement.

Priorité dans l’usage des bibliothèques : Dans l’exemple suivant, le data set SEQ1, SEQ2 et SEQ3 sont dans la bibliothèque WORK. Si aucune bibliothèque n’est donnée dans l’instruction APPEND, SAS utilise celle définie dans l’instruction PROC DATA SETS. Et comme aucune n’y est précisée, cela revient à utiliser la bibliothèque temporaire (WORK le plus souvent).

proc datasets;*lib=work;
   append base=seq1 data=seq2;
   *append base=work.seq1 data=work.seq2;
   append base=seq1 data=seq3;
run;

Voici la même manipulation avec PROC APPEND.

proc append base=seq1 data=seq2;
*proc append base=work.seq1 data=work.seq2;
run;
proc append base=seq1 data=seq3;
run;

Vous pouvez vous reporter à la documentation SAS : The DATASETS Procedure et consulter l’instruction APPEND. On y rappelle notamment quand le data set de la base (BASE=), les options DROP, KEEP et RENAME ne sont pas exécutées.

3. Au final pas de doublons avec l’UNION d’une PROC SQL

Important : L’UNION de deux data sets avec une PROC SQL enlèvera les doublons. Il est donc important de savoir s’il y a des doublons qui sont à enlever ou non.

Ici, on peut faire l’union de plus de deux data sets. Ils devront néanmoins tous avoir les mêmes variables.

proc sql;
   create table seq_all as
      select * from seq1
   union
      select * from seq2
   union
      select * from seq3;
quit;

4. Insérer de nouvelles observations extraites d’un autre data set

Il est possible aussi d’ajouter les observations avec l’instruction INSERT INTO. Le data set d’origine est alors actualisé. Dans l’exemple ci-dessous on ajoute seulement les observations des data sets SEQ2 et SEQ3 s’il si le test mesure la pression systolique (Systolic Blood Pressure, SBP).

NOTE : Il est important de sélectionner les observations à ajouter d’un data set différent de celui à mettre à jour. Sinon, SAS risque de rencontrer des problèmes. Voir la SAS Online Doc: INSERT Statement pour plus de précisions.

proc sql;
  insert into seq1
     select *
     from seq2
     where test_nom=‘SBP’;
  insert into seq1
     select *
     from seq3
     where test_nom=‘SBP’;
quit;

Annexe :

data seq1;
   length test_nom $3 test_unit $4;
   input test_nom $ test_seq test_val test_unit $;
   datalines;
SBP 1 120 mmHg
DBP 1 80 mmHg
DBP 1 80 mmHg
;
run;

data seq2;
   length test_nom $3 test_unit $4;
   input test_nom $ test_seq test_val test_unit $;
   datalines;
SBP 2 115 mmHg
DBP 2 85 mmHg
;
run;

data seq3;
   length test_nom $3 test_unit $4;
   input test_nom $ test_seq test_val test_unit $;
   datalines;
SBP 3 117 mmHg
DBP 3 81 mmHg
;
run;

h1

Mes 1ers pas avec ODS TAGSETS.EXCELXP (2/3)

mai 19, 2008

Sous SAS, l’ODS TAGSETS.EXCELXP est une alternative au PROC EXPORT. Dans une première partie, vous avez vu comment modifier la largeur d’une colonne, gérer l’alignement des valeurs textes et former une cellule unique servant de titre à plusieurs colonnes, le tout avec la syntaxe de proc report. Maintenant vous allez découvrir comment modifier les couleurs, polices de caractères, etc. en créant un nouveau template.

1. La structure de base de PROC TEMPLATE

Une autre particularité que l’on rencontrera dans le fichier Excel, c’est la présence de la couleur grise pour le fond ces cellules ayant des données, une couleur bleuté pour le texte des cellules contenant le nom des variables, etc.

Pour altérer ces couleurs, disons remettre du blanc en fond et du texte en noir, on va créer un nouveau template à partir d’un existant. Il suffira alors de modifier les quelques paramètres qui nous intéresse.

La structure de base du PROC TEMPLATE est la suivante :

proc template;
   define style styles.vero_xls;
   parent=style.default;
   *style x from x /…;
run;

J’ai donné le nom vero_xls à ce nouveau STYLE. Vous pouvez choisir le nom qui vous plaira. L’important est de se référer au même nom par la suite. 

2. Les instructions STYLE de PROC TEMPLATE

Il existe plusieurs instructions STYLE, selon qu’il s’agisse :

  • de la partie non couverte par les données : style Table from Table
  • de la partie couverte par les noms de colonnes : style Header from Header
  • de la partie couverte par le nom des lignes (dans un proc print, les valeurs de la variable obs) : style RowHeader from RowHeader
  • de la partie couverte par les données : style Data from Data
  • de l’apparence de la page A4 d’impression : style Body from Body

Voicic trois autres styles :

  •    style SystemTitle from SystemTitle /…;
  •    style SystemFooter from SystemFooter /…;
  •    style SysTitleAndFooterContainer from SysTitleAndFooterContainer /…;

3. Les options des instructions STYLE

Les options sont situées après la barre inclinée (slash /). Les valeurs prises par ces options sont notées entre guillemets.

 Les options les plus courantes sont :

  • FOREGROUND = (couleur du texte). Ici, on choisira le mot ‘black’ entre guillemets.
  • BACKGROUND = (couleur des cellules). Ici, on choisira ‘white’.
  • FONT_SIZE = (la taille du texte). Ici, on choisira 1.5 par exemple.
  • FONT_FACE = (la ou les polices de caractères). Ici, on choisi ‘Courier’. Mais on peut aussi opter pour ’Courier,Arial’. Ainsi si la police Courier n’est pas disponible, Arial sera le second choix.

Deux autres options du langage courant

  • FONT_WEIGHT= (mette en gras). La valeur BOLD sert à mettre en gras
  • FONT_STYLE= (mettre en italique ou non). La valeur ITALIC met en italique tandis que ROMAN fait l’inverse.

Agir dur les bordures des cellules :

  • BORDER_COLOR= (couleur de la bordure)
  • BORDER_WIDTH= (largeur de la bordure)

Agir sur les marges du document A4.

  • LEFTMARGIN = (marge de gauche)
  • RIGHTMARGIN = (marge de droite)
  • TOPMARGIN = (marge du haut)
  • BOTTOMMARGIN = (marge du bas)

Note : Une liste des différents styles est disponible sur ce forum : http://www.tek-tips.com/viewthread.cfm?qid=1178234&page=1.

4. Faire référence au nouveau template

Pour que ce template soit lu à la place de celui par défaut, on ajoutera STYLE=nom_du_nouveau_template dans l’instruction ODS TAGSETS.EXCELXP de début.

ods tagsets.excelxp file  = ‘C:/excel/mon_nouveau_fichier.xls’
                    style = vero_xls;
proc report …;
run;
ods tagsets.excelxp close;

Après avoir vu les actions menées au niveau du PROC REPORT et du PROC TEMPLATE pour personnaliser son fichier Excel, vous verrez dans le troisième et dernier article sur “Mes premiers pas avec ODS TAGSETS.EXCELXP”, lundi prochain, les options disponibles dans l’instruction ODS.

h1

Mon paramètre de macro est-il rempli ?

mai 18, 2008

Une macro sous SAS peut dans certains cas être comparée à un questionnaire. A chaque question (parameter) correspond plusieurs réponses possibles (parameter value). Certains réponses peuvent êtes obligatoires, d’autres facultatives. Dans le cas où la réponse est impérative mais n’est pas fournie par l’utilisateur, il faut pouvoir l’avertir : arrêter l’exécution du programme de manière propre et l’informer des éléments à fournir. Trois notions de programmation aideront à construire cette vérification (check).

1. Passer un message

Une condition en langage macro : ici, une macro est définie. Des instructions globales sont exécutées, si le paramètre de la macro est vide. Cette condition est donc définie avec une instruction du langage macro %IF … %THEN … %DO; …; %END;

Un message dans la log : l’objectif est d’informer l’utilisateur sur la nécessité d’une valeur pour le paramètre INPUT_VAL. Pour faire apparaître ce texte d’ERREUR dans la log, l’instruction du langage macro %PUT fera le travail.

Pas besoin de guillemets avec %IF ou %PUT : le paramètre d’une macro est une forme de macro variable. Pour retrouver sa valeur, son nom est donc entouré d’un symbole & et d’un point. Si cette valeur doit apparaître dans une chaîne de caractères entre guillemets, il faut impérativement utiliser des guillemets doubles. Dans le cas contraire, comme ici dans une instruction %IF ou %PUT, on se passe de guillemets pour résoudre la macro variable.

%macro test_param (input_val=,output_val=);
%if &input_val. = %then
   %do;
      %put ERREUR: Le macro paramètre INPUT_VAL= est obligatoire;
   %end;
*suite du programme;
%mend test_param;
%test_param (input_val=,output_val=);

Personnaliser son message : quand SAS rencontre une erreur, il utilise le mot ERROR dans la log. Pour distinguer ce message des votre, vous pouvez ajouter un mot-clé comme le nom de la macro. Par exemple : “ERROR – TEST_PARAM: the INPUT_VAL= macro parameter is mandatory.”.

2. Gérer les caractères spéciaux : il est fréquent d’avoir des valeurs autres que les chiffres et les lettres de l’alphabet comme valeur pour un paramètre de macro. Vous aurez souvent besoin de définir l’emplacement des données sources et celui où les outputs seront sauvegardées. Pour cela, les paramètres auront des valeurs du type c:/mon_projet/mesdonnees ou encore c:/mon_projet/mes_resultats. Il existe des macros fonctions : %BQUOTE et %NBRQUOTE pour tenir compte de la barre inclinée (slash) et d’autres caractères spéciaux.

  • %BQUOTE : les symboles suivants sont gérés avec la fonction %BQUOTE() : ‘ ” ( ) + – * / < > = ¬ ^ ~ ; , blanc AND OR NOT EQ NE LE LT GE GT
  • %NBRQUOTE : si, en plus, vous avez les symboles & (et) et % (pourcentage), il faudra faire appel à la macro fonction %NBRQUOTE().

SAS online DOC :

3. Enjamber un programme

Si la condition n’est pas remplie, on peut demander à SAS d’ignorer une partie du code grâce à la syntaxe de %GOTO. Il était également possible de demander à SAS d’arrêter son exécution en plein milieu. Certes, enjamber le code permet d’avoir une log plus propre, puisque seuls nos messages apparaissent. Mais surtout, cela permet de poursuivre l’exécution du programme. Ainsi, si un appel de macro ne fonctionne pas, rien n’empêche de continuer la soumission d’autres appels de cette macro.

Dans un premier temps, il s’agit de définir une balise. A partir de cette position, SAS pourra continuer son exécution. Ici, la balise s’appelle FIN_PGM. Elle est ajoutée juste avant la fin du la macro.

Dans un second temps, si le paramètre est vide, SAS est prié d’ignorer le code qui suit jusqu’à la balise. Pour cela, dans la condition, l’instruction %GOTO est ajoutée.

%macro test_param (input_val=,output_val=);
%if &input_val. = %then
   %do;
      %put ERREUR: Le macro paramètre INPUT_VAL= est obligatoire;
      %goto fin_pgm;
   %end;
*suite du programme;
%fin_pgm:
%mend test_param;
%test_param (input_val=,output_val=);

h1

Mes 1ers pas avec ODS TAGSETS.EXCELXP (1/3)

mai 12, 2008

SAS propose une alternative au PROC EXPORT pour créer un fichier Excel à partir de données SAS. Il s’agit de l’ODS TAGSETS.EXCELXP. Celle-ci fait preuve de flexibilité tant pour ajouter les labels des variables, définir la largeur des colonnes qu’ajouter les filtres aux colonnes ou encore créer plusieurs feuilles par fichier Excel. Voici donc le premier des articles consacrées à mes découvertes de ces derniers jours sur le sujet : ”syntaxe de base et options changeables au niveau de la procédure Proc Report”.

1. La syntaxe de base : tout d’abord, il s’agit d’encadrer la proc report, proc print, ou autre entre deux instructions ODS TAGSETS.EXCELXP. La première instruction servira en premier lieu à définir le nom et la destination du nouveau fichier Excel. La seconde instruction fermera le processus de création du fichier Excel.

ods tagsets.excelxp file=‘C:/excel/mon_nouveau_fichier.xls’;
   proc report data=resultats;
      columns pop grp subgrp check;
      define pop    / display ‘Pop’;
      define grp    / display ‘Pays’;
      define subgrp / display ‘Ville’;
      define check  / display ‘Check’;
      run;
ods tagsets.excelxp close;

Un premier essai au résultat et on se rendra compte de plusieurs “imperfections” que l’on souhaitera changer à commencer par la largeur des colonnes.

2. Changer la largeur des colonnes : avec un PROC REPORT, il est possible d’affiner l’apparence (le STYLE) des colonnes et notamment celui de la largeur des colonnes. Si on veut que toutes les colonnes soient de la même largeur, l’option STYLE(COLUMN) sera ajoutée dans l’instruction PROC REPORT, sinon elle sera ajoutée dans chaque instruction DEFINE. Si un grand nombre de colonnes doit avoir la même largeur, il est possible de combiner les deux méthodes. Tout d’abord, la largeur la plus fréquente dans l’instruction PROC REPORT est définie. Ensuite, les colonnes devant avoir une valeur différente sont actualisées dans leur instruction DEFINE.

proc report data=resultats style(column)=[cellwidth=3cm];
   columns pop grp subgrp check;
   define pop    / display ‘Pop’
                   style(column)=[cellwidth=5cm];
   define grp    / display ‘Pays’;
   define subgrp / display ‘Ville’;
   define check  / display ‘Check’;
run;

Note : Les options WIDTH= et FLOW des instructions DEFINE perdent ici leur utilisé puisque le texte n’est pas coupé.

3. Centrer ou aligner à gauche, à droite : de la même manière que définir la largeur des colonnes, changer l’alignement du texte (pas des nombres) est possible avec JUST=center (left ou right). Par défaut, les textes sont alignés à gauche et les nombres sont alignés à droite. On peut choisir de changer l’alignement :

  • soit au niveau des valeurs (style(column)),
  • soit au niveau du nom des variable (style(header)).

Gérer certains formatage avec TAGATTR= est un autre attribut possible de STYLE(COLUMN). Voici deux exemples d’application :

  • Sur le même principe que le format Zw., les zéros situées en entête d’une variable numérique sont conservés. On ajoutera autant de zéro que nécessaire.
  • Les variables numériques sont affichées comme du texte, si l’arobas @ est utilisé.
  • Mais il ne semble pas possible de combiner les deux notations. Mais corrigez-moi si je me trompe.

proc report …;
   define check    / display ‘Check’
                     style(column)=[tagattr='format:000'];
   define check    / display ‘Check’
                     style(column)=[tagattr='format:@'];
run;

4. Un nom de colonne commun à plusieurs colonnes : sous Excel, il est très simple de sélectionner deux cellules et de demander à ce qu’elles n’en forment plus qu’une seule. Pour faire la même chose en SAS, on fait appel à la syntaxe de PROC REPORT.

   columns pop (‘Zone géographique’) grp subgrp check;

Si on choisi de combiner des cellules, l’ajout d’un filtre sur les colonnes concernées peut paraître inapproprié. En effet, le filtre n’utilisera que les valeurs de la première colonne.

Dans la seconde partie (lundi prochain) sur ODS TAGSETS.EXCELXP, vous verrez comment modifier les couleurs, la police de caractère, etc. en créant un template.

Annexe : data set servant d’exemple

data resultats;
   input pop grp $2. subgrp $5. check $4.;
   datalines;
1 AL Alger 001A
1 AL Oran  003
1 MO Rabat 002
2 CH Bern  001A
2 NO Oslo  004
;
run;

h1

3 propositions pour exporter un graphique

mai 8, 2008

Créer un graphique est une chose. Pouvoir l’extraire de SAS pour l’exploiter en est une autre. Ici, nous verrons comment l’envoyer directement dans un document Word, comment sauvegarder son graphique sous forme de fichier image ou sous forme de catalogue graphique SAS. Pour cela nous utiliserons un diagramme en barre généré avec PROC GCHART.

A chaque fois, les options graphiques sont au préalable réinitialisées avec RESET=ALL. Puis un DEVICE GIF est assigné.

goptions reset=all;
goptions device=gif;

1. Ajouter un graphique dans un fichier Word

L’output Delivery System (ODS) est assez récent dans SAS. RTF est le format lu part Word. La procédure générant le code SAS est entouré de deux instructions ODS RTF. La première définie le nom et la destination du fichier RTF. La seconde stoppe l’écriture dans le fichier RTF

goptions reset=all;
goptions device=gif;

ods rtf file=‘C:/sasref/dest_word.rtf’;
   proc gchart data=cnt;
      vbar maingrp /sumvar=cnt ;
   run;

ods rtf close;

2. Envoyer un graphique dans un catalogue graphique SAS

Un catalogue (catalog) est un fichier propre à SAS. On peut y stocker soit des graphiques (graphic catalog), soit des formats (format catalog) mais pas les deux à la fois. Ici, on stocke le fichier dans un catalogue graphique nommé DEST_CAT, qui est sauvegardé dans la bibliothèque SASREF. Ces graphiques peuvent être ensuite rappelés par un PROC GREPLAY pour créer une nouvelle image. Celle-ci sera soit une superposition de graphiques, soit des graphiques mis les uns à côté des autres. Cette image pourra aussi être insérés dans un document RTF via ODS RTF TEXT (fichiers JPG ou PNG seulement, pas de fichier GIF…). Dans tous les cas, ODS LISTING doit être activé.

goptions reset=all;
goptions device=jpeg;
  
libname sasref ‘C:/sasref/dest_pic.jpg’;

proc gchart data=cnt gout=sasref.dest_cat;
   vbar maingrp /sumvar=cnt ;
run;

3. Sauvegarder un graphique sous forme de fichier image

Pour créer une image, il faut au préalable ajouter GSFNAME= à l’instruction GOPTIONS. Le chemin d’accès à l’image et son nom sont définis dans une instruction FILENAME. Le nom de ce FILENAME est rappelé dans GSFNAME.

filename orig ‘C:/sasref/dest_pic.gif’;

goptions reset=all;
goptions device=gif gsfname=orig;

proc gchart data=cnt;
   vbar maingrp /sumvar=cnt ;
run;

filename orig clear;

Annexe : data set source

data cnt;
   input maingrp $ subgrp $ subgrp2 $ cnt;
   datalines;
1 1 A 12
1 2 A 13
1 3 B  6
2 1 A 15
2 2 B 22
2 3 B 10
2 4 B  2
2 5 B 51
3 1 A 13
3 2 A 21
;
run;

h1

Repérer les 1ers/derniers records (FIRST/LAST)

mai 6, 2008

Repérer la première et/ou la dernière observation d’un jeu de données ou d’un sous-ensemble de ce jeu, c’est possible sous SAS avec les mots-clés FIRST et LAST dans un data step. On se sert de cette information sous forme de condition. Si la première observation est rencontrée, on fait ceci, sinon on fait cela. Cela sert pour créer une variable compteur ou pour générer plusieurs programmes via un DATA _NULL_, programmes variant par quelques valeurs listées dans un fichier de référence.

1. Le raisonnement FIRST/LAST en langage humain

Dans l’exemple ci-dessous, on a tout d’abord deux variables MEMNAME et NAME qui sont triées. Ensuite sont ajoutées plusieurs variables.

Les variables FRST_DSN/LST_DSN

  • S’il s’agit de la première fois que l’on lit la valeur de la variable MEMNAME, alors on donne une value de 1 à FRST_DSN, sinon on donne une valeur de 0.
  • Si au contraire, il s’agit de la dernière valeur avant de changer, LST_DSN prend la valeur 1, sinon il prend la valeur 0.

Dans l’exemple, on remarque que FRST_DSN et LST_DSN sont toutes les deux égale à 1 quand MEMNAME=DSN2, car il n’y a qu’une observation pour ce MEMNAME. La première observation est donc également la dernière,

memname  name  frst_dsn lst_dsn frst_var lst_var
    dsn1       var1          1          0           1          0
    dsn1       var1          0          0           0          0
    dsn1       var1          0          0           0          1
    dsn1       var2          0          0           1          1
    dsn1       var3          0          1           1          1    
    dsn2       var1          1          1           1          1    

    dsn3       var1          1          0           1          1
    dsn3       var2          0          0           1          1
    dsn3       var3          0          0           1          1
    dsn3       var4          0          1           1          1    
    dsn4       var1          1          0           1          1
    dsn4       var2          0          1           1          1       

FRST_VAR/LST_VAR : une fois dans un groupe (DSN1, DSN2, DSN3 ou DSN4), on regarde la seconde variable NAME.

  • Si on a la première fois la valeur dans ce groupe, FRST_VAR=1 sinon FRST_VAR=0.
  • Si au contraire, il s’agit de la dernière fois qu’on l’observe dans ce group, LST_VAR=1, 0 autrement.

Dans l’exemple, seul le DSN1 a plusieurs fois une VAR1 associée. C’est donc le seul moment où FRST_VAR n’est pas égal à LST_VAR.

NOTE, choix de l’auteur : entendez FRST pour rappeler le mot FIRST (premier), LST le mot LAST (dernier) et DSN le mot DATA SET NAME (nom du jeu de données).

2. Le raisonnement FIRST/LAST en langage SAS

SAS lie les données d’un jeu de données ligne par ligne. On rassemble les données par groupe en les triant. On rappelle cet ordre avec une instruction BY.

Ici les variables MEMNAME et NAME sont extraites de la bibliothèque SASHELP grâce au dictionnaire COLUMN.

proc sql;
   create table lst_dsn_var as
   select memname, name
   from dictionary.columns
   where upcase(libname)=’SASHELP’;
quit;

Puis, chacune des variables FRST_DSN, LST_DSN, FRST_VAR et LST_VAR sont crées. Ces variables prennent une valeur de 1, si la condition est vrai (s’il s’agit bien de la première ou de la dernière observation), 0 sinon. Bien sûr, on peut choisir de leur donner la valeur que l’on veut.

data _null_;
   set lst_dsn_var;
   by memname name;
   if first.memname then frst_dsn=1;
   else frst_dsn=0;
   if last.memname then lst_dsn=1;
   else lst_dsn=0;
   if first.name then frst_var=1;
   else frst_var=0;
   if last.name then lst_var=1;
   else lst_var=0;
run;

NOTE : SAS se base sur les données d’origine pour dire si oui ou non, il s’agit de la première/dernière observation. Dès lors, si le jeu d’origine est altéré (suppression de lignes), SAS ne redéfinira pas une première/dernière observation parmi celles restantes. On peut donc ne plus avoir l’observation considérée par SAS comme première/dernière. Il choisira si besoin de faire les deux opérations dans des data steps distincts.

3. La première et la dernière observation d’un data set

Vous n’aurez pas toujours une variable prenant la même valeur pour toutes les observations et ainsi retrouver la première et la dernière observation. On peut soit en créer une avec un RETAIN par exemple ou plus simplement utiliser

  • la variable automatique _N_ pour la première observation et
  • la variable assignée avec l’option END= dans l’instruction SET pour la dernière observation.

data _null_;
   set lst_dsn_var end=eof;
   if _N_=1 then …;
   if eof then…;
run;

NOTE : Par habitude, on donne ici le nom EOF (End Of File) comme nom à la variable qui prend une valeur 1 s’il s’agit de la dernière observation, 0 autrement. Comme la variable automatique _N_, EOF n’apparaît pas dans le data set final, s’il est créé.

h1

8 compétences pour un CV grâce aux loisirs

mai 2, 2008

KL

Faites de vos loisirs un argument pour montrer vos qualités humaines. En plus de vos jobs d’été et vos stages, vos loisirs parlent pour vous. Avant de rechercher une compétence, l’employeur veut un collaborateur qui s’intègre bien à l’équipe en place, qui défend la même philosophie, les mêmes valeurs. C’est une très bonne chose. Cela réduit les chances de passez 5 jours par semaine au boulot avec des personnes qui vont sont antagonistes à défendre des projets que vous désapprouvez. Voici quelques pistes. A vous d’adaptez et de compléter selon votre parcours.

1. Intervenez en réunion : bureau des élèves, association, club sont trois cas où les réunions sont monnaie courante. En tant que conducteur de réunion vous apprendrez à être concis, gérer les interventions. En tant que secrétaire de réunion, vous apprendrez à planifier une rencontre, rédiger un compte-rendu de réunion. En tant qu’intervenant, vous mettrez en avant vos qualités d’orateur.

2. Travaillez en équipe : qu’il s’agisse de vacances en groupe, de groupe de musique, d’un sport d’équipe ou de travail volontaire, votre capacité d’évoluer en équipe sera mise à l’épreuve.

3. Prenez le téléphone : qu’il s’agisse de faire des démarches administratives, de démarcher pour une association, d’organiser des vacances, prenez le téléphone et contactez des personnes que vous ne connaissez pas pour faire des réservations, prendre rendez-vous. Cette capacité à prendre le téléphone vous servira toujours en commençant par la recherche d’un job pour établir un suivi de vos candidatures.

4. Faites preuve d’initiative : si vous aimeriez qu’une activité existe pour vos besoins personnels, c’est peut-être le moment de se demander si vous ne pourriez pas être le moteur de ce projet.

5. Négociez dans la vie de tous les jours : dans vos achats de la vie courante, prenez l’habitude de négocier. Vous serez surpris de ce que vous pouvez obtenir. Cette pratique est très peu courante dans les pays occidentaux. Pourtant cette capacité pourra s’avérer très utile pour négocier votre rémunération.

6. Apprenez via vos lectures : vos lectures sur le monde professionnel seront un bon outil pour évoluer. Personnellement, j’affectionne particulièrement le magasine Management et le blog www.conseilsmarketing.fr.

7. Donnez des formations : votre côté pédagogique sera valorisé si vous donnez des formations. On vous pose régulièrement des questions sur un sujet que vous maîtrisez ? Vous connaissez des organismes ayant besoin de vos compétences. Si c’est le cas, c’est peut-être le moment d’envisager de donner des cours.

8. Encadrez un groupe : en encadrant une sortie, vous mettrez en valeur vos capacités d’organisation et votre souhait de prendre des responsabilités. Encadrer des sorties sportives ou être moniteur dans un camp de vacances sont d’excellentes expériences.