Avec PROC REPORT et PROC TABULATE, SAS crée des tableaux à partir d’un jeu de donnée (SAS data set). Dans certains cas, la lisibilité de ces tableaux est améliorée en ajoutant des indentations au texte (to indent). Nous verrons donc ici deux approches possibles : l’option INDENT de PROC TABULATE et le caractère hexadécimal pour les blancs dans PROC REPORT.
1. Un exemple pour illustrer la syntaxe sur les indentations
Dans les essais cliniques, trois types de tableaux/listings sont produits :
- Démographie (demography) : descriptif des patients en terme d’âge, de sexe, de pays, etc.
- Efficacité (efficacy) : l’efficacité du médicament par rapport à un autre ou par rapport à un effet placebo (le patient prend en médicament en pensant qu’il est actif alors qu’il ne l’est pas).
- Sécurité (safety) : ces tableaux permettent l’analyse des effets secondaires d’un médicament.
Je vais prendre la cas d’un tableau démographique version réduite (trois colonnes) pour présenter la syntaxe sur les indentations.
- La première colonne contient les caractéristiques démographiques (sexe et pays),
- la seconde colonne compte le nombre de patients (N) pour chaque caractéristique
- la troisième colonne donnera la répartition des patients en pourcentage (%).
--------------------------------- | | N | % | |-------------------------------| |Gender | | | Male | 12| 48 %| | Female | 13| 52 %| |Country | | | France | 6| 24 %| | Belgium | 10| 40 %| | Luxemburg | 9| 36 %| ---------------------------------
Des variables numériques pour ordonner les valeurs : Pour faciliter le tri des données, j’ai choisi d’avoir des variables numériques dans mon data set SAS sur lesquelles j’applique des formats.
- Ainsi la premier variable (GRP) réfère à l’intitulé des caractéristiques démographiques : Gender (1) Country (2).
- La seconde variable (SUBGRP) est l’ordre pour chaque caractéristique. J’aurais pu choisir des valeurs de 1 à 5 mais j’ai préféré que chaque chiffre des décimal corresponde à la variable GRP.
data patient_info; input grp subgrp cnt_n pct_n; datalines; 1 11 12 0.48 1 12 13 0.52 2 21 6 0.24 2 22 10 0.40 2 23 9 0.36 ; run;
Je choisi de créer des formats du même nom (GRP et SUBGRP) :
proc format; value grp 1='Gender' 2='Country'; value subgrp 11='Male' 12='Female' 21='France' 22='Belgium' 23='Luxemburg'; run;
En outre, je crée un format avec PICTURE pour l’affichage des pourcentages. La raison est la suivante : par défaut, deux chiffres après la virgules apparaissent avec PROC TABULATE. De plus, je souhaite voir le symbole % s’afficher pour chaque pourcentage.
Un format BEST5. est ajouté pour des fréquences composées jusqu’à 5 chiffres sans décimale. De plus, il remplace les points par des blancs. Cela servira pour PROC REPORT.
proc format; picture pct (round) . = '' other = '099 %' (multiplier=100); value cnt . = ' ' other = [best5.]; run;
Dans les deux exemples qui suivent une indentation est formée de trois blancs.
2. L’option INDENT de PROC TABULATE
Dans l’exemple suivant, les deux variables GRP et SUBGRP sont traitées comme des variables textuelles.
L’instruction TABLE contient l’option INDENT= et précise ainsi le nombre de blancs pour décaler les valeurs de la variable SUBGRP vers la droite. Le résultat a été donné en début d’article.
proc tabulate data=patient_info noseps; class grp subgrp; table grp=''*subgrp='', cnt_n='N'*sum=' '*f=5. pct_n='%'*sum=' '*f=pct. / rts=20 indent=3; format grp grp. subgrp subgrp.; run;
Les options NO=SEPS et RTS= sont là pour personnaliser la mise en forme. Pour plus de précisions sur ces options, vous pouvez consulter la documentation en ligne :
- NOSEPS sur la page « PROC TABULATE Statement »
- RTS= sur la page « TABLE Statement »
3. Créer des variables alphanumériques (caractères) avec PROC REPORT
Ajouter une ligne pour chacune des caractéristiques : Toutes les informations sont créées manuellement. Ainsi, il y a en plus une ligne pour chaque groupe dans le data set SAS. Au lieu d’avoir 5 lignes, on en aura 7. Pour chaque nouveau GRP, la variable SUBGRP prendre la valeur du GRP + un zero afin d’apparaître en premier dans le rapport après un tri.
proc sort data = patient_info out = patient_report; by grp subgrp; run;
data patient_report; set patient_report; by grp subgrp; output; if first.grp then do; subgrp=grp*10; cnt_n=.; pct_n=.; end; run;
Trier par SUBGRP pour afficher les données dans l’ordre voulu.
proc sort data=patient_report; by grp subgrp; run;
Une fois triées les données sont toujours numériques.
grp subgrp cnt_n pct_n 1 10 . . 1 11 12 0.48 1 12 13 0.52 2 20 . . 2 21 6 0.24 2 22 10 0.40 2 23 9 0.36
Créer des variables caractères : la variable DSPLAY nouvellement créée peut contenir jusqu’à 15 caractères. Elle est composée des variables GRP et SUBGRP converties avec la fonction PUT.
Des hexadécimales pour créer des blancs : Les espaces sont créés à partir de valeurs hexadécimales. On répète ici trois fois A0 entre guillemets pour créer trois espaces. La lettre x qui suit précise à SAS qu’il s’agit d’hexadécimales. Ces trois blancs sont concaténés au résultat de la fonction PUT grâce aux deux barres.
data patient_report; length dsplay $15; set patient_report; if subgrp=0 then dsplay=put(grp,grp.); else dsplay='A0A0A0'x || put (subgrp,subgrp.); cnt_c=put(cnt_n,cnt.); pct_c=put(pct_n,pct.); run;
Trier les données : La variable SUBGRP sert uniquement à définir l’ordre d’affichage des données mais n’apparaît pas dans le tableau final (option NOPRINT dans l’instruction DEFINE).
Enlever le titre de la colonne : La variable DSPLAY contient les caractéristiques démographiques. Aucun nom n’apparaîtra dans le titre de la colonne. Si les guillemets vides ne sont pas précisés, le nom de la variable est affiché.
Aligner à droite : Les variables caractères CNT_C et PCT_C sont affichées en tant que texte (DISPLAY) et leurs observations sont alignées à droite plutôt que d’être centrées (option RIGHT).
proc report data=patient_report; columns subgrp dsplay cnt_c pct_c; define subgrp / noprint order order=data; define dsplay / ' ' display; define cnt_c / 'N' display right; define pct_c / '%' display right; run;
Dans ce cas, la sortie se présente sans ligne autour du cadre :
N % Gender Male 12 48 % Female 13 52 % Country France 6 24 % Belgium 10 40 % Luxemburg 9 36 %
Sur le blog, vous trouverez d’autres articles sur les notions abordées ici :
- Vous découvrez PROC REPORT ? Cet article vous offre une introduction sur la procédure : 6 notions pour débuter avec PROC REPORT
- L’instruction OUTPUT a servi pour ajouter de nouveaux records dans le data set. Voici un article plus complet sur le sujet : Faire des petits avec l’instruction OUTPUT
- La fonction PUT a permis de créer notre variable caractère DSPLAY à partir de variables numériques et de formats. L’article Convertir une variable caractère en numérique et inversement se consacre à se sujet.
- La syntaxe PICTURE est discutée dans l’article Arrondir ses chiffres avant d’apppliquer un format.