Thématique
Créer une variable caractère à partir d'une autre variable caractère à l'aide de la fonction put : éviter une troncature due à des valeurs non disponibles dans le format
Mots-clés
*function #put *format #proc format #(default=)
#other
Données
data lb; length lbtest $40; lbtest='Hematocrit'; output; lbtest='Leukocytes'; output; lbtest='HDL Cholesterol/Total Cholesterol'; output; run;
Programme
proc format; value $lbtest 'Hematocrit' ='HCT' 'Leukocytes' ='WBC' 'HDL Cholesterol'='HDL'; value $lbtestcd 'HCT'='Hematocrit' 'WBC'='Leukocytes' 'HDL'='HDL Cholesterol'; run; data lb_new; set lb; length lbtestcd $40; lbtestcd=put(lbtest,$lbtest.); run;
La variable lbtestcd
est créée à partir de la variable lbtest
et du format $lbtest.
L'objectif est d'obtenir le nom court du test de laboratoire à partir du nom long.
Hematocrit
devientHCT
Leukocytes
devientWBC
- La valeur "
HDL Cholesterol/Total Cholesterol
" n'est pas présent dans le format$lbtest.
. Il devient "HDL
", qui a une signification différente. Selon le format$lbtestcd.
, cela signifieHDL Cholesterol
.
a) Tâche
Afficher la longueur et la longueur par défaut du libellé du format $lbtest.
.
- En utilisant l'option fmtlib
- En sauvegardant les informations relatives au format dans un dataset.
Solution Possible 1
proc format fmtlib; select $lbtest; run;
Solution Possible 2
proc format cntlout=lbtest; select $lbtest; run; proc print data=lbtest noobs; var fmtname start label min max length default; run;
La largeur du libellé du format est le nombre maximum de caractères observés dans la variable LABEL
.
La largeur par défaut du libellé du format est égale à la largeur du libellé du format, à moins qu'une autre valeur ne soit spécifiée lors de la création du format. Dans cet exemple, la largeur par défaut du libellé du format est de 3.
b) Question
Pourquoi "HDL Cholesterol/Total Cholesterol
" devient-il "HDL
"?
Solution Possible
La largeur par défaut du libellé du format, 3, est utilisée dans la fonction put parce qu'aucune autre largeur n'est définie pour remplacer la valeur par défaut.
Étant donné qu'aucun code du format ne correspond à la valeur "HDL Cholesterol/Total Cholesterol
", l'ensemble du texte est copié, mais seuls les trois premiers caractères sont conservés en raison de la largeur pour le libellé du format.
La longueur de la variable, 40, ne résout pas le problème. Elle ne peut que raccourcir davantage la chaîne lorsque sa valeur est inférieure à la largeur du libellé de format utilisé.
c) Tâche
Mettre à jour le programme afin d'afficher le nom complet du test dans la variable lbtestcd
lorsqu'aucune correspondance n'est disponible dans le format.
- Modifier la largeur par défaut du libellé du format lors de la création du format, ou
- Modifier la largeur du libellé du format indiqué dans la fonction put.
Avant |
Après |
Solution Possible 1
proc format; value $lbtest (default=40) 'Hematocrit' ='HCT' 'Leukocytes' ='WBC' 'HDL Cholesterol'='HDL'; run; data lb_new; set lb; *length lbtestcd $40; lbtestcd=put(lbtest,$lbtest.); run;
Solution Possible 2
La largeur par défaut du libellé du format peut être remplacée lors de l'utilisation du format dans la fonction put.
data lb_new; set lb; *length lbtestcd $40; lbtestcd=put(lbtest,$lbtest40.); run;
d) Task
Mettre à jour le programme afin d'afficher le texte "To Check
" lorsqu'aucune correspondance n'est disponible dans le format.
Avant |
Après |
Solution Possible
proc format; value $lbtest 'Hematocrit' ='HCT' 'Leukocytes' ='WBC' 'HDL Cholesterol'='HDL' other ='To Check'; run; data lb_new; set lb; length lbtestcd $40; lbtestcd=put(lbtest,$lbtest.); run;