100% ont trouvé ce document utile (1 vote)
1K vues466 pages

Sas 9.2

Learning SAS

Transféré par

B_S
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
100% ont trouvé ce document utile (1 vote)
1K vues466 pages

Sas 9.2

Learning SAS

Transféré par

B_S
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Sébastien Ringuedé

SAS
Version 9.2
Introduction au décisionnel :
méthode et maîtrise du langage
®

http://www.free-livres.com/

Préface de Daniel Delorge,


Directeur général SAS France
SAS Livre Page I Jeudi, 18. septembre 2008 6:03 18

Sébastien Ringuedé

Université d’Orléans, LEO, UMR CNRS 6221

SAS
Introduction au décisionnel :
méthode et maîtrise du langage
SAS Livre Page II Jeudi, 18. septembre 2008 6:03 18

SAS® software, SAS® 6.12, SAS® 8.2, SAS®9, SAS® 9.1.3, SAS® 9.2, AppDev StudioTM
software, SAS® Business Intelligence server, SAS High Power Forecasting® software, SAS Enter-
prise Guide® software, SAS® Enterprise Intelligence Platform, Enterprise MinerTM software,
SAS OnlineDoc® documentation, SAS®Metadata Server, SAS/ACCESS® software, SAS/
CONNECT® software, SAS/ETS® software, SAS/GRAPH® software, SAS/IML® software,
SAS/INSIGHT® software, SAS/IntrNet® software, SAS/OR® software, SAS/SHARE® software,
SAS/STAT® software, SAS® Integration Technologies, SASware Ballot® sont des marques
déposées de SAS Institute inc., Cary, North Carolina, USA.

Publié par Pearson Education France


47 bis, rue des Vinaigriers
75010 PARIS
Tél. : 01 72 74 90 00

Mise en pages : TyPAO

ISBN : 978-2-7440-4167-9
Copyright © 2008 Pearson Education France
Tous droits réservés

Tous les autres noms de produits ou de marques cités dans cet ouvrage sont des marques déposées par
leurs propriétaires respectifs.

Le nom SAS désignera en fonction du contexte le produit, le langage ou la société qui commercialise
le progiciel SAS. SAS se prononce comme un nom « SAS » et non comme un sigle.

Aucune représentation ou reproduction, même partielle, autre que celles prévues à l’article L. 122-5 2˚ et 3˚ a)
du code de la propriété intellectuelle ne peut être faite sans l’autorisation expresse de Pearson Education
France ou, le cas échéant, sans le respect des modalités prévues à l’article L. 122-10 dudit code.
SAS Livre Page III Jeudi, 18. septembre 2008 6:03 18

Remerciements

Je tiens à remercier SAS France pour m’avoir confié une version de SAS 9.2 afin de
pouvoir terminer cet ouvrage. Mes remerciements vont plus particulièrement à
Ariane Sioufi, Directeur Académique SAS France,
Grégoire de Lassence, Responsable Pédagogie et Recherche SAS France,
pour leur aide et leurs encouragements.
Le propos de cet ouvrage n’engage que son auteur et en aucun cas SAS Institute s.a.s,
filiale de SAS Institute Inc., ni SAS Institute Inc.

Cet ouvrage n’aurait pas pu être écrit sans l’aide de relecteurs. Mes remerciements
vont tout particulièrement à Bernard Gestin ainsi qu’à Roselyne Adame Key, Gildas
Amegbo, Karim Aroussi, Alaâ-Eddine Aznag, Edwige Balliet, Claire Formont,
Mihaela Ivanof, Lucie Moreau, Carole Njoya, Séverine Outreville, Amélie Renvoisé,
Dieudonné Sondjo, Sessi Tokpavi et plus généralement aux étudiants du master ESA
(Économétrie et Statistique Appliquée) de l’université d’Orléans qui, par leurs ques-
tions et leurs remarques, ont enrichi au fil du temps cet ouvrage qui n’était au départ
que le support de mon cours d’introduction à SAS.
www.univ-orleans.fr/deg/masters/ESA/
Les erreurs et imprécisions qui pourront apparaître dans cet ouvrage restent miennes.

Les demandes d’éclaircissements et de suggestions seront toujours les bienvenues :


[email protected]
Le site compagnon de cet ouvrage est un élément indispensable à votre apprentissage
de SAS :
www.sas-sr.com

Merci à Gilbert Colletaz et Christophe Hurlin pour leur patience…


À Laurence, Léonie, Marceau et Lucien qui ne connaissent de SAS que le temps que
j’ai passé à la rédaction de cet ouvrage.
SAS Livre Page IV Jeudi, 18. septembre 2008 6:03 18
SAS Livre Page V Jeudi, 18. septembre 2008 6:03 18

Table des matières

Remerciements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . III
Préface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XIII
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Présentation de l’ouvrage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Progresser dans votre connaissance de SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Comment travailler avec cet ouvrage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
La certification SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Aller plus loin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
SAS : une communauté active d’utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Les différentes versions de SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
SAS Windows, Unix, OpenVMS, z/OS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Disposer du système SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Conventions typographiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1. Créer une table SAS* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.1 Faisons connaissance avec SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2 Les tables SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.3 Cas simple : les informations sont séparées par un espace . . . . . . . . . . 16
1.3.1 Créons notre première table SAS. . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.3.2 L’éditeur SAS : une aide à la programmation . . . . . . . . . . . . . . . . 18
1.3.3 Demander l’exécution d’un programme. . . . . . . . . . . . . . . . . . . . 20
1.3.4 Les bibliothèques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.4 Comprenons bien le cas simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.5 Les valeurs manquantes sur variables numériques . . . . . . . . . . . . . . . . 28
1.5.1 Plus de deux modalités aux valeurs manquantes . . . . . . . . . . . . . 31
1.5.2 Cas des valeurs manquantes saisies par aucun signe . . . . . . . . . . 32
2. Pour aller plus loin dans la création de tables SAS* . . . . . . . . . . . 33
2.1 La création d’une table SAS à partir d’un fichier informatique . . . . 33
2.2 Autres indicateurs de séparation des modalités . . . . . . . . . . . . . . . . . . 36
2.2.1 Les modalités sont séparées par des tabulations. . . . . . . . . . . . . . 36
2.2.2 Les modalités sont séparées par des virgules. . . . . . . . . . . . . . . . . 37
2.2.3 Les modalités sont séparées par un caractère quelconque. . . . . . . . . 38
2.2.4 Les modalités sont séparées par un point-virgule . . . . . . . . . . . . 38
2.3 Les données présentées en colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.3.1 Premier cas : l’absence d’espace entre les modalités . . . . . . . . . . 39
2.3.2 Cas général . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
SAS Livre Page VI Jeudi, 18. septembre 2008 6:03 18

VI ◆ SAS

2.3.4 Le positionnement relatif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42


2.3.5 Un cas particulier : la dernière modalité est de longueur variable . 43
2.3.6 Position relative et position absolue des modalités . . . . . . . . . . . 44
2.3.7 Une seconde application de @x . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.4 Les espaces dans les modalités de variables alphanumériques . . . . . . . 45
2.5 Toutes les observations apparaissent sur une même ligne . . . . . . . . . . 47
2.6 Les modalités relatives à une même observation apparaissent
sur plusieurs lignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.6.1 Cas simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.6.2 Cas moins simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.6.3 Un dernier cas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.7 Retour sur la gestion des valeurs manquantes . . . . . . . . . . . . . . . . . . . . . 52
2.8 Les INFORMAT : format des valeurs entrantes . . . . . . . . . . . . . . . . . . . 54
2.8.1 Les INFORMAT des variables alphanumériques . . . . . . . . . . . . . 54
2.8.2 Les INFORMAT des variables numériques . . . . . . . . . . . . . . . . . 57
a. Quelques INFORMAT sur variables numériques . . . . . . . . . 58
b. Préciser ou pas W . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
c. Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
2.8.3 Des variables numériques particulières : les dates et heures. . . . 63
a. Les INFORMAT de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
b. L’option YEARCUTOFF . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
c. Les INFORMAT de temps . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
2.8.4 Créons notre propre INFORMAT !. . . . . . . . . . . . . . . . . . . . . . . . 68
a. Cas simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
b. Cas plus complexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
2.9 Exportons nos tables SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Conclusion des chapitres 1 et 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Regardez et comprenez votre fichier brut . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Lisez la fenêtre JOURNAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Examinez votre table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
3. La modification des tables SAS* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
3.1 L’exécution par SAS de vos programmes . . . . . . . . . . . . . . . . . . . . . . . 84
3.1.1 Les informations descriptives de la table. . . . . . . . . . . . . . . . . . . . 85
3.1.2 La longueur de l’enregistrement des variables alphanumériques 86
3.1.3 L’impossibilité de modifier le type de la variable . . . . . . . . . . . . . 87
3.1.4 L’exécution du programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
3.1.5 Les conséquences du RESET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
3.1.6 OUTPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
3.1.7 RETURN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
3.2 Les opérateurs et les fonctions usuelles de construction
et de transformation de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
3.2.1 Les opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
3.2.2 Les fonctions numériques usuelles . . . . . . . . . . . . . . . . . . . . . . . . 95
3.2.3 Les fonctions statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
SAS Livre Page VII Jeudi, 18. septembre 2008 6:03 18

Table des matières ◆ VII

3.2.4 Les fonctions particulières aux séries temporelles . . . . . . . . . . . . 97


3.2.5 Les générateurs de nombres aléatoires . . . . . . . . . . . . . . . . . . . . . 97
3.2.6 Les fonctions sur les chaînes de caractères . . . . . . . . . . . . . . . . . . 98
3.2.7 La concaténation de variables alphanumériques . . . . . . . . . . . . . 102
3.2.8 Les fonctions propres aux dates . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
3.2.9 Une fonction spécifique aux valeurs manquantes . . . . . . . . . . . . 108
3.3 Alléger une table SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
3.3.1 Effacer certaines variables/ne conserver que certaines variables. 108
3.3.2 Écarter ou ne conserver que certaines observations :
WHERE, IF et SELECT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
a. IF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
b. WHERE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
c. SELECT/WHEN/OTHERWISE . . . . . . . . . . . . . . . . . . . . . . 113
3.3.3 Sélection d’observations à partir de leur numéro d’observation 115
3.4 La construction de nouvelles variables au sein d’une table SAS . . . . . . 116
3.4.1 La conversion des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
3.4.2 La construction sans condition . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
3.5 La construction sous conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
3.5.1 Les commandes IF – THEN – ELSE . . . . . . . . . . . . . . . . . . . . . . . 120
3.5.2 Les commandes IF THEN/ELSE IF THEN . . . . . . . . . . . . . . . . . . 120
3.5.3 Les commandes IFN et IFC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
3.5.4 La commande IF/GOTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
3.5.5 Les commandes SELECT/WHEN/OTHERWISE. . . . . . . . . . . . . 124
3.5.6 Une dernière possibilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
3.6 Les boucles DO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
3.6.1 Le DO simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
3.6.2 Le DO itératif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
3.6.3 Les boucles DO UNTIL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
3.6.4 Les boucles DO WHILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
3.7 Les boucles sur ARRAY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
3.7.1 Principes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
3.7.2 Exemples d’application. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
3.8 Donner une mémoire à SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
3.8.1 La commande RETAIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
3.8.2 La commande RETAIN alliée aux options FIRST et LAST . . . . . 135
3.8.3 Faire référence à des valeurs passées . . . . . . . . . . . . . . . . . . . . . . . 139
3.9 Les listes de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
3.9.1 Première possibilité. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
3.9.2 Deuxième possibilité : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
3.9.3 Troisième possibilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
3.9.4 Quatrième possibilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
4. Combiner les tables SAS* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
4.1 Ajouter des individus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
4.2 Ajouter des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
4.2.1 PROC SORT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
SAS Livre Page VIII Jeudi, 18. septembre 2008 6:03 18

VIII ◆ SAS

4.2.2 MERGE – Cas standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147


4.2.3 Le cas des séries temporelles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
4.2.4 Merger des tables de dimensions différentes . . . . . . . . . . . . . . . . 149
4.2.5 Quelques sources de problème en cas de merge. . . . . . . . . . . . . . 149
4.2.6 La nature des variables clés de réunion de deux tables . . . . . . 150
4.3 La mise à jour : commande UPDATE . . . . . . . . . . . . . . . . . . . . . . . . . . 151
4.4 Les marqueurs : un outil utile dans les phases de merge . . . . . . . . . . . . . 153
5. Faciliter la gestion des tables SAS* . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
5.1 La procédure PROC CONTENTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
5.2 Les LABEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
5.3 L’attribution d’un FORMAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
5.3.1 L’utilisation de FORMAT prédéfinis sur des variables
numériques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
5.3.2 FORMAT ou INFORMAT ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
5.3.3 Quelques FORMAT utiles sur variables numériques. . . . . . . . . . 162
5.3.4 Les FORMAT d’affichage des variables de date . . . . . . . . . . . . . . 163
5.3.5 Les FORMAT d’affichage des variables alphanumériques . . . . . . . 166
5.3.6 La création de FORMAT spécifiques. . . . . . . . . . . . . . . . . . . . . . . 167
a. PROC FORMAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
b. Assigner des FORMAT spécifiques de façon permanente
à une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
c. Utiliser des FORMAT spécifiques dans des sorties
sans que ceux-ci soient dans la table SAS . . . . . . . . . . . . . . 169
d. Créer plusieurs FORMAT spécifiques
pour une même variable . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
e. Les FORMAT entrelacés . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
5.3.7 Une seconde utilisation de PUT . . . . . . . . . . . . . . . . . . . . . . . . . . 172
5.4 La longueur de l’enregistrement des variables numériques . . . . . . . . . . . 173
5.5 La gestion des tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
5.5.1 Quelques bonnes pratiques de gestion de vos tables . . . . . . . . . . 175
5.5.2 Empêcher SAS de réécrire une table de même nom . . . . . . . . . . 177
5.6 La gestion des OPTIONS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
5.6.1 Les options de SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
5.6.2 Le niveau de modification des options . . . . . . . . . . . . . . . . . . . . . 180
5.6.3 La modification du fichier de configuration SASV9.CFG . . . . . . 181
5.6.4 AUTOEXEC.SAS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
6. Quelques procédures de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
6.1 Titres et pieds de pages de vos sorties dans la fenêtre SORTIE* . . . . . . 186
6.2 PROC MEANS* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
6.2.1 Le choix des mots clés statistiques . . . . . . . . . . . . . . . . . . . . . . . . . 190
6.2.2 Les tables d’OUTPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
6.2.3 La paramétrisation de vos sorties. . . . . . . . . . . . . . . . . . . . . . . . . . 193
6.3 PROC UNIVARIATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
6.4 PROC PRINT* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
SAS Livre Page IX Jeudi, 18. septembre 2008 6:03 18

Table des matières ◆ IX

6.4.1 PROC PRINT pour des sorties dans la fenêtre SORTIE . . . . . . . 197
6.4.2 PROC PRINT et ODS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
a. La syntaxe de l’option STYLE . . . . . . . . . . . . . . . . . . . . . . . . 206
b. Premier exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
c. « Traffic lightening » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
6.5 PROC REPORT* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
6.5.1 Exemples simples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
6.5.2 L’instruction DEFINE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
6.5.3 Les variables et leurs usages possibles . . . . . . . . . . . . . . . . . . . . . . 214
a. Les variables ORDER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
b. Les variables GROUP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
c. Les variables ACROSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
d. Les variables COMPUTED . . . . . . . . . . . . . . . . . . . . . . . . . . 219
6.5.4 Les rapports intégrant des informations de type liste
et des informations de synthèse . . . . . . . . . . . . . . . . . . . . . . . . . . 221
a. Cas simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
b. Quelques précautions à prendre . . . . . . . . . . . . . . . . . . . . . . 223
6.5.5 Trois exemples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
a. 1er exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
b. Second exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
c. Un dernier exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
6.5.6 PROC REPORT et ODS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
6.6 PROC FREQ* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
6.6.1 Les tableaux de fréquences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
6.6.2 Les tableaux croisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
6.7 PROC TABULATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
6.7.1 Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
6.7.2 Exemples d’applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
a. Structures lignes-colonnes des tableaux . . . . . . . . . . . . . . . . 238
b. Les variables d’analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
c. Choix de la statistique éditée dans le tableau . . . . . . . . . . . . 242
d. L’introduction de récapitulatifs dans le tableau . . . . . . . . . . 244
e. L’introduction de pourcentage dans les tableaux . . . . . . . . 247
6.7.3 PROC TABULATE et ODS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
7. Les graphiques sous SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
7.1 Les commandes STATEMENTS dans SAS/GRAPH . . . . . . . . . . . . . . . 256
7.1.1 Les polices et couleurs dans SAS/GRAPH. . . . . . . . . . . . . . . . . . . 257
a. Les couleurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
b. Les polices dans SAS/GRAPH . . . . . . . . . . . . . . . . . . . . . . . . 260
7.1.2 GOPTIONS : les options graphiques. . . . . . . . . . . . . . . . . . . . . . . 262
7.1.3 Les titres, les pieds de pages, les notes dans SAS/GRAPH . . . . . . . . . 264
7.1.4 Les commandes AXIS<1…99> . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
7.1.5 Les commandes PATTERN<1…99> . . . . . . . . . . . . . . . . . . . . . . 269
SAS Livre Page X Jeudi, 18. septembre 2008 6:03 18

X ◆ SAS

7.2 PROC GCHART . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271


7.2.1 Les options possibles de HBAR et VBAR . . . . . . . . . . . . . . . . . . . 273
a. Options de présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
b. Options statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
c. Options sur les points centraux . . . . . . . . . . . . . . . . . . . . . . . 276
d. Options sur les axes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
7.2.2 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
7.3 PROC GPLOT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
7.3.1 Les graphiques proposés par GPLOT . . . . . . . . . . . . . . . . . . . . . . 290
a. Syntaxe de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
b. Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
7.3.2 Les commandes LEGEND<1…99> . . . . . . . . . . . . . . . . . . . . . . . 294
a. Créons nos premières légendes . . . . . . . . . . . . . . . . . . . . . . . 295
b. Quelques options possibles de LEGEND . . . . . . . . . . . . . . . 297
7.3.3. Les commandes SYMBOL <1…99> . . . . . . . . . . . . . . . . . . . . . 299
a. Options d’apparence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
b. Les méthodes d’interpolation . . . . . . . . . . . . . . . . . . . . . . . . 303
7.3.4 PLOT2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
7.3.5 Exemples – première partie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
7.3.6 L’édition de vos graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
7.3.7 Exemples – deuxième partie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
7.4 Vos graphiques et ODS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
7.4.1 Un exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
7.4.2 Les polices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
7.4.3 GOPTIONS DEVICE= . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
7.5. SAS 9.2 – Les procédures « STATISTICAL GRAPHICS » . . . . . . . . . . . 329
8. ODS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
8.1 ODS : les principes* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
8.1.1 Les raisons d’utiliser ODS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
8.1.2 Les destinations ODS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
8.1.3 ODS DOCUMENT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
8.1.4 Une première approche des sorties en HTML . . . . . . . . . . . . . . . 335
8.1.5 Les limites des sorties ODS générées automatiquement . . . . . . . . . 337
8.2 ODS HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
8.2.1 La gestion des fichiers créés par ODS* . . . . . . . . . . . . . . . . . . . . . 338
8.2.2 Plusieurs procédures dans une sortie unique* . . . . . . . . . . . . . . . 339
8.2.3 Introduction de tables des matières*. . . . . . . . . . . . . . . . . . . . . . . 341
8.2.4 Paramétrer la table des matières – première partie . . . . . . . . . . . 342
8.2.5 Personnaliser vos sorties – ODS TRACE . . . . . . . . . . . . . . . . . . . 344
8.2.6 ODS SELECT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
8.2.7 Destinations multiples des sorties* . . . . . . . . . . . . . . . . . . . . . . . . 348
8.2.8 ODS OUTPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
8.2.9 Faciliter la navigation sur Internet. . . . . . . . . . . . . . . . . . . . . . . . . 351
SAS Livre Page XI Jeudi, 18. septembre 2008 6:03 18

Table des matières ◆ XI

8.3 Agir sur votre environnement – la procédure PROC TEMPLATE . . . . 355


8.3.1 La détermination des blocs de style à modifier. . . . . . . . . . . . . . . 355
8.3.2 La modification des polices utilisées . . . . . . . . . . . . . . . . . . . . . . . 357
8.3.3 Modifier l’allure d’un tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
8.3.4 La modification des couleurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
8.3.5 La sauvegarde des styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
8.3.6 Ajouter de nouveaux attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
8.4 ODS RTF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
8.4.1 La gestion des grands tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
8.4.2 La modification de vos tableaux dans Excel . . . . . . . . . . . . . . . . . 369
8.4.3 Les modifications de styles dans ODS RTF. . . . . . . . . . . . . . . . . . 370
8.5 ODS PRINTER et ODS PDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
8.5.1 ODS PRINTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
8.5.2 ODS PDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
8.5.3 Un premier exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
8.5.4 ESCAPECHAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
8.5.5 Second exemple – illustration des capacités d’ESCAPECHAR . 379
8.5.6 Création d’une page de garde. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
8.5.7 La personnalisation de la table des matières – deuxième partie . 382
8.5.8 La construction de vos sommaires avec ODS. . . . . . . . . . . . . . . . 383
8.6 Un nouvel outil : ODS GRAPHICS . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
9. Le langage macro sous SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
9.1 Les concepts du langage macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
9.2 Les macro-variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
9.2.1 Accéder à la valeur d’une macro-variable . . . . . . . . . . . . . . . . . . . 394
9.2.2 Les macro-variables automatiques . . . . . . . . . . . . . . . . . . . . . . . . 395
9.2.3 La suppression des macro-variables . . . . . . . . . . . . . . . . . . . . . . . 397
9.3 Les fonctions macro du langage SAS . . . . . . . . . . . . . . . . . . . . . . . . . . 398
9.3.1 La routine CALL SYMPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
9.3.2 La fonction SYMGET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
9.4 Les macro-fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
9.4.1 Les macro-fonctions sur chaînes de caractères. . . . . . . . . . . . . . . 406
9.4.2 Les macro-fonctions permettant l’évaluation. . . . . . . . . . . . . . . . 407
9.4.3 Les macro-fonctions de quoting . . . . . . . . . . . . . . . . . . . . . . . . . . 408
9.5 Premiers exemples sans macro-programme . . . . . . . . . . . . . . . . . . . . . 411
9.6 Les macro-programmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
9.6.1 Environnement local/environnement global . . . . . . . . . . . . . . . . 417
9.6.2 GLOBAL/LOCAL : pour quoi faire ? . . . . . . . . . . . . . . . . . . . . . . . 419
9.6.3 Le paramétrage des macro-programmes . . . . . . . . . . . . . . . . . . . 420
9.6.4 Les macro-commandes propres aux macro-programmes. . . . . . 422
a. Les constructions conditionnelles : %IF . . . . . . . . . . . . . . . 423
b. Les boucles %DO simples . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
c. %DO %WHILE et %DO %UNTIL . . . . . . . . . . . . . . . . . . . 427
9.7 Conserver ses macro-programmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
SAS Livre Page XII Jeudi, 18. septembre 2008 6:03 18

XII ◆ SAS

9.8 Quelle aide au débogage des macro-programmes ? . . . . . . . . . . . . . . . 429


9.8.1 Ordre et Méthode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
9.8.2 Les outils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
9.9 Un cas pratique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
9.9.1 Les données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
9.9.2 Les différents graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
Bibliographie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445

* La présence d’un astérisque indique que le point développé fait partie du programme de la certification
SAS (SAS 9 certification base programming). Un astérisque à côté d’un intitulé de chapitre indique
que le chapitre complet est au programme de la certification. S’il est présent à côté d’un nom de
section, seuls la section et ses développements font partie du programme de la certification.
SAS Livre Page XIII Jeudi, 18. septembre 2008 6:03 18

Préface

Ayant moi-même été un utilisateur SAS, avant de prendre la responsabilité du déve-


loppement de la filiale française il y a bientôt vingt ans, j’ai eu un grand intérêt et un
réel plaisir à découvrir l’ouvrage réalisé par Sébastien Ringuedé.
SAS propose des solutions décisionnelles pour transformer les données en connais-
sance, et ainsi, permettre de prendre la bonne décision au bon moment. Depuis plus
de trente ans, les solutions SAS couvrent l’ensemble du processus d’informatique
décisionnelle, de l’intégration de sources de données d’origines multiples, leur trans-
formation, leur stockage et leur analyse, jusqu’à la diffusion de l’information et de la
connaissance. La métamorphose entre les solutions SAS® 8 et celles reposant sur la plate-
forme décisionnelle intégrée SAS® 9 permet notamment de répondre aux nouveaux
problèmes d’administration et d’ergonomie. Néanmoins, une grande partie de la
puissance et de l’adaptabilité de ces solutions est due au fait que celles-ci reposent sur
le langage de programmation de quatrième génération : le langage SAS. Toutes les
applications de la plate-forme SAS sont basées sur ce socle fondamental et il est possible
de l’adapter pour peu que l’on sache programmer en SAS.
Objectivement, le langage SAS est l’un des plus puissants et des plus stables du
marché. Savoir programmer correctement en SAS est une compétence incontourna-
ble pour l’adaptation des solutions SAS aux besoins spécifiques de chaque entreprise.
Nous proposons des solutions pour répondre aux problématiques les plus pointues
des différents métiers de l’entreprise (finance, ressources humaines, logistique,
marketing, gestion des risques…) et leur apportons une réponse pour l’analyse et la
gestion de leur performance. Nous avons aussi développé des solutions répondant
aux spécificités sectorielles auxquelles elles peuvent être confrontées (optimisation
des marges dans la grande distribution, obligations réglementaires dans la banque,
fraude à l’assurance, attrition dans les télécommunications…). Les entreprises
privées et publiques ont des attentes de plus en plus fortes en termes d’optimisation,
de pilotage et de mesure de leurs performances ; les projets décisionnels n’ont jamais
été aussi nombreux et variés. Il est nécessaire qu’il y ait des personnes sachant
programmer en SAS pour les mettre en place et assurer leur succès.
Plus qu’une initiation, cet ouvrage de référence est un vrai cours complet, en français,
pour apprendre à programmer en SAS. Les années d’expérience pédagogique de
l’auteur sont ici synthétisées en un livre à la fois clair, accessible et complet. Bien plus
que les concepts, il permet de découvrir la philosophie et la logique du langage SAS.
Je le recommande donc vivement aussi bien aux professionnels qui doivent déployer
la plate-forme SAS, qu’aux enseignants-chercheurs dans leurs travaux académiques,
ou aux étudiants souhaitant rapidement maîtriser le socle de base de SAS.
Nous retrouvons ici tous les éléments nécessaires qui, complétés par un minimum
d’exercices pratiques, doivent permettre de passer la certification « SAS Base Program-
ming for SAS®9 ». SAS propose des solutions à des problématiques très complexes.
SAS Livre Page XIV Jeudi, 18. septembre 2008 6:03 18

XIV ◆ SAS

Mais aussi intelligentes ces solutions logicielles soient-elles, elles nécessitent de la


matière grise pour les mettre en place et les maintenir. Nos clients ont donc besoin de
compétences fiables. Les certifications SAS sont des attestations individuelles à validité
internationale, reconnues par nos clients et nos partenaires.
Vous trouverez aussi quelques-unes des dernières fonctionnalités mises en produc-
tion avec SAS 9.2, Sébastien Ringuedé étant l’un des premiers partenaires académi-
ques à en bénéficier. Rappelons que SAS est né dans l’université. Ce livre est une
preuve de plus que les relations entre la société SAS et les universités sont bien plus
qu’un discours politique : il s’agit d’un engagement solide et durable.
Daniel Delorge
Directeur Général de SAS France
SAS Livre Page 1 Jeudi, 18. septembre 2008 6:03 18

Introduction

Présentation de l’ouvrage
Cet ouvrage s’adresse à tous les utilisateurs débutants ou de niveau intermédiaire du
langage SAS, qu’ils soient en formation dans les départements d’économie, de gestion,
de mathématiques appliquées, de statistique, de biologie, de STID, de MIAGE, d’IAE des
universités, dans les écoles de commerce, d’ingénieurs, ou qu’ils évoluent déjà
dans le monde professionnel.
Le système SAS est très vaste : on pourrait presque dire qu’il existe autant d’utili-
sations de SAS que d’utilisateurs. Il existe cependant un socle commun de connaissances
mobilisées quotidiennement par tous ces utilisateurs. C’est ce socle que se propose
d’explorer cet ouvrage.
L’ouvrage vise à présenter les connaissances fondamentales et transversales nécessai-
res à la programmation SAS, plus particulièrement à la création, la modification, la
manipulation et la gestion des tables de données. Il s’intéresse également aux procé-
dures d’exploration et de première exploitation des données. Enfin, il aborde la
production de graphiques, de documents de présentation en format HTML, RTF ou
PDF, ainsi que le langage macro propre au système SAS.
Pour les utilisateurs qui ont pour finalité la manipulation et la transformation de
données, puis la production de rapports présentant ces dernières, cet ouvrage détaille
les outils qu’ils doivent mobiliser.
Pour les personnes qui utilisent en plus les outils économétriques et statistiques, nous
couvrons dans cet ouvrage les phases en amont et en aval de l’analyse qu’elles doivent
mener au moyen du système SAS.
Aucun travail d’analyse ou de construction de rapport n’est possible sur des données
non préparées. Les outils que nous aborderons au cours des six premiers chapitres
vous aideront à mettre en forme ces données et à les explorer.
Il s’agit d’une phase essentielle de votre travail puisque les données, dans leur forme
brute, n’ont jamais la forme des données sur lesquelles vous pouvez directement
appliquer vos outils économétriques et statistiques ou sur la base desquelles vous
pouvez immédiatement rédiger un rapport.
Les données brutes que l’on vous confiera devront dans un premier temps être
transformées en une table SAS parfaitement fidèle à vos données originales. C’est
précisément l’objet des chapitres 1 et 2. Nous examinons dans le chapitre 3 les
outils à votre disposition pour créer, à partir des variables présentes dans une table
brute et au moyen de transformations et de combinaisons, les variables nécessaires
à votre travail.
SAS Livre Page 2 Jeudi, 18. septembre 2008 6:03 18

2 ◆ SAS

Dans de très nombreux cas, il est aussi nécessaire de mobiliser plusieurs sources de
données et donc de combiner des tables entre elles. C’est ce que nous voyons dans le
chapitre 4. Ainsi, ce n’est pas une seule mais plusieurs tables que vous manipulerez,
dans des versions plus ou moins évoluées. Il est donc nécessaire de les organiser et de
les gérer de façon à travailler le plus efficacement possible. Ce point essentiel est traité
dans le chapitre 5.
Nous examinons dans le chapitre 6 un ensemble de procédures à même de vous permet-
tre d’explorer, de connaître et de comprendre vos données. On ne peut en effet analyser
ou présenter des données que si on les connaît bien. Ces outils d’exploration des tables
vont seront utiles aussi dans la phase de retransmission de vos résultats puisque, même si
votre finalité première est l’analyse économétrique ou statistique, vous aurez très
souvent besoin de présenter au moyen de tableaux les données qui servent de base à
votre analyse.
Nous présentons dans le chapitre 7 les procédures graphiques qui peuvent, ici encore,
être utiles lors des phases d’exploration et de présentation de vos résultats.
La phase de présentation des résultats est réalisée en aval de l’analyse. C’est une phase
importante puisque votre travail d’analyse ne rencontrera jamais l’attention qu’il
mérite s’il est livré dans une forme brute. Le document doit être attrayant par sa
forme et indiquer de façon claire les principaux résultats que vous avez obtenus.
Les entreprises construisent des bases de données de plus en plus importantes et c’est
le rôle du statisticien de tirer de ces données des informations essentielles au dévelop-
pement de son entreprise. Ce rôle, de par la position qu’occupe le statisticien, est
particulier. Les analyses que peut fournir le statisticien sont destinées non pas à
d’autres statisticiens mais à des personnes qui devront, sur la base de ces analyses,
prendre des décisions.
Une part essentielle du travail du statisticien en entreprise est donc d’expliquer au
moyen d’un langage non technique l’essentiel de ses résultats. Bien sûr, il ne s’agit pas
de privilégier le fond au détriment de la forme : les analyses que vous fournirez
devront être techniquement indiscutables mais vous n’obtiendrez pas l’attention que
mérite votre analyse si leur forme n’est pas attrayante.
La retransmission de vos résultats et la rédaction de rapports mobilisent à nouveau
les procédures présentées dans le chapitre 6 ainsi que les procédures graphiques
explorées dans le chapitre 7. Nous examinons dans le chapitre 8 l’Output Delivery
System (ODS) livré avec SAS. Au moyen de cet outil offert par SAS, vous avez en effet
la possibilité de produire en quelques instructions des documents attrayants au
format HTML, RTF (Rich Text Format), que vous pouvez coller dans votre traitement
de texte, ou PDF. Ce dernier format peut être utilisé si vous souhaitez effectuer une
présentation au moyen d’un vidéoprojecteur.
Le chapitre 9 consacré au langage macro conclut cet ouvrage. En effet, pour percevoir
l’intérêt du langage macro, il faut avoir une certaine expérience de SAS et être conscient
que votre travail comprend des phases répétitives ou qu’il suffit de modifier quelques
instructions pour qu’un programme dédié au traitement d’une table spécifique
puisse aussi analyser une autre table. Après une large introduction au langage macro
de SAS, nous présentons un exemple mobilisant les connaissances que vous aurez
acquises au cours des huit premiers chapitres.
SAS Livre Page 3 Jeudi, 18. septembre 2008 6:03 18

Introduction ◆ 3

Progresser dans votre connaissance de SAS


Cet ouvrage ne saurait prétendre à l’exhaustivité. Cependant, il aborde les problèmes
les plus courants et vous donne les outils qui vous permettront de les résoudre.
Ainsi, le chapitre 7, consacré aux graphiques, explore principalement deux types de
graphiques : les histogrammes et les courbes. À cette occasion, sont présentés les
éléments de langage communs à toutes les procédures graphiques. En effet, une fois
que vous maîtriserez ces deux outils ainsi que le langage propre à l’environnement
graphique, vous pourrez aisément exploiter les possibilités des autres procédures
graphiques offertes par SAS.
Chaque chapitre commence par expliquer les concepts de base avant d’aborder des
notions plus complexes. Ainsi, dans l’exposé d’une procédure, il y aura peu de rapport
entre les résultats simples que nous proposerons dans un premier temps et les derniers
résultats. Ces derniers résultats ne peuvent cependant pas être compris sans les premières
parties dans lesquelles les principaux concepts sont exposés avant d’être mis en pratique.
C’est pour cette même raison que le chapitre consacré au langage macro est présenté
en dernier : il mobilise en effet l’ensemble des connaissances abordées dans les huit
premiers chapitres.
Nous avons fait le choix de passer sous silence les interfaces proposées par SAS qui
permettent en quelques clics de réaliser un graphique, d’importer des données, de
créer des tableaux, etc. Ces interfaces, certes conviviales, écrivent le programme à
votre place mais ne vous dispensent absolument pas de connaître les outils de la
programmation SAS. En effet, ces interfaces ne peuvent mobiliser 100 % des outils de
programmation offerts par les procédures qu’elles émulent. Si votre demande s’éloi-
gne des cas standard et si vous n’avez aucune connaissance des outils de la program-
mation SAS, vous ne pourrez pas comprendre le programme créé par votre interface
et le modifier de manière qu’il produise le résultat souhaité.
Les utilisateurs avancés de SAS qui prétendent ne pas coder ajoutent généralement
que c’est parce qu’ils ont beaucoup codé…

Comment travailler avec cet ouvrage


Le site compagnon de cet ouvrage est le complément indispensable à votre travail
d’apprentissage de SAS. Vous retrouverez ce site à l’adresse suivante :
www.sas-sr.com
Ce site vous offre :
• tous les programmes proposés dans l’ouvrage ;
• toutes les sorties générées par ces programmes, y compris celles non reproduites
dans cet ouvrage ;
• tous les fichiers nécessaires à la reproduction des exemples ;
• tous les fichiers nécessaires aux exercices proposés ;
• les solutions aux exercices proposés ;
• des compléments à cet ouvrage ;
SAS Livre Page 4 Jeudi, 18. septembre 2008 6:03 18

4 ◆ SAS

• l’ensemble des liens vers des sites Internet proposés dans cet ouvrage ;
• des outils de recherche, simples d’utilisation, qui permettent de retrouver des
exemples de programmes qui emploient des commandes et des options spécifiques.
Tout au long des chapitres, des exercices vous sont proposés. N’attendez pas d’avoir lu
l’intégralité d’un chapitre pour les effectuer : ils sont indispensables à la compréhen-
sion des notions abordées et constituent généralement des passerelles entre les différents
concepts.
Ne consultez les solutions qu’au terme d’une réelle réflexion ! C’est en commettant
des erreurs que l’on progresse.
À partir du chapitre 5, les exercices sont moins nombreux. Vous êtes invité à repro-
duire l’intégralité des nombreux exemples de programmation proposés afin de bien
comprendre l’impact de chacune des commandes et options utilisées. Vous avez la
possibilité d’en retirer certaines ou de les remplacer par d’autres. Les exemples qui
concluent les différentes sections des chapitres 6, 7, 8, et 9 mobilisent l’ensemble des
concepts évoqués auparavant. Si vous ne deviez reproduire que ces exemples, le seul
enseignement que vous risquez d’en tirer, c’est le constat d’une identité entre ce que
vous aurez sur votre écran et ce que vous décrit l’ouvrage.
Si vous ne comprenez pas les concepts, vous ne pourrez rien apprendre d’un
programme offrant plus de cinq instructions. Vous maîtriserez les concepts lorsque, avant
même l’exécution du programme, vous aurez une idée précise de la structure du résultat
produit.

La certification SAS
Cet ouvrage couvre l’intégralité du programme SAS 9 Certification Base Program-
ming. Il va même au-delà en approfondissant certains domaines et en explorant des
domaines non couverts par la certification comme SAS/GRAPH et le langage macro.
Les sections qui font partie du programme de la certification SAS sont indiquées au
moyen d’un astérisque dans le sommaire. Pour plus de détails sur le programme de
cette certification, vous pouvez consulter le site suivant :
support.sas.com/certify/creds/testbp9.html
Cette certification est reconnue internationalement et constitue un réel plus dans un
curriculum vitae. Nous vous encourageons vivement à la passer dans l’un des centres
de test PROMETRIC. Si votre formation est partenaire de SAS ACADEMIC, vous pour-
rez bénéficier de coûts réduits. L’épreuve, d’une durée de deux heures, prend la forme
d’un QCM de 70 questions en anglais sur ordinateur. Pour chaque question, 4 réponses
sont proposées. Si vous avez au moins 46 bonnes réponses, vous obtenez la certifi-
cation. Bien entendu, pendant le temps de l’épreuve, vous ne disposez pas de SAS.
Le centre de formation SAS, de son côté, propose une offre associant une journée de
préparation à la certification, un manuel d’entraînement et l’examen.
www.sas.com/france/services/training/certification.html
Attention, j’attire votre attention sur le fait que, pour réussir cette certification, vous
devez connaître parfaitement le système SAS. Vous connaîtrez le système SAS lorsque
vous pourrez dire, en examinant différents programmes mais sans les exécuter, ce que
vous allez obtenir ou pourquoi ils ne peuvent pas fonctionner. Cette connaissance ne
SAS Livre Page 5 Jeudi, 18. septembre 2008 6:03 18

Introduction ◆ 5

s’acquiert qu’au moyen d’une pratique régulière et approfondie des outils évoqués
dans le programme de la certification.
La compréhension du système SAS ne suffit pas. Cette phase de compréhension, premier
stade de votre apprentissage, vous permet uniquement de comprendre pourquoi un
programme ne fonctionne pas lorsque vous l’exécutez.
Le site compagnon de cet ouvrage donne des exemples de questions qui pourraient
vous être posées dans le cadre de cette certification1.

Aller plus loin


Nous indiquerons très souvent des liens Internet vers des documents devant vous
permettre d’approfondir vos connaissances dans un domaine particulier. Cependant,
malgré le soin apporté et le temps passé à la rédaction de cet ouvrage, il est possible
que vous ne trouviez pas de réponse à la question que vous vous posez. Dans ce cas,
vous devrez de vous-même trouver d’autres sources.
Votre première source de renseignements est bien entendu l’aide SAS installée sur votre
ordinateur, que vous activez avec la touche F1 de votre clavier. Vous pouvez aussi
ouvrir le menu Aide, puis sélectionnez Introduction au système SAS. Vous naviguez
dans cette aide de trois manières :
• Par l’onglet Sommaire. Vous pouvez consulter alors l’aide SAS comme vous
consultez un livre.
• Par l’onglet Index. Vous devez alors indiquer l’instruction au sujet de laquelle
vous recherchez des renseignements.
• Par l’onglet Rechercher. Indiquez plusieurs mots clés et explorez les pages de
l’aide qui contiennent ces mots.
Nous ferons souvent référence à des articles de l’aide SAS, soit en partant de l’onglet
Sommaire, soit en indiquant l’entrée à consulter dans l’Index. En vous invitant à
consulter tel ou tel article, nous souhaitons vous aider là aussi dans votre apprentis-
sage de l’aide SAS dans laquelle il pourrait vous sembler difficile de naviguer. Dans cet
ouvrage, lorsque nous ferons référence à une entrée de l’aide, merci de respecter
minuscules et majuscules pour retrouver l’article cité.
Si l’aide SAS n’est pas installée sur votre ordinateur, vous pouvez aussi la consulter sur
le site support de SAS : support.sas.com/documentation/
À partir de cette page, vous pouvez accéder à l’aide de :
• SAS 8.2 : v8doc.sas.com/sashtml/
• SAS 9.1.3 : support.sas.com/onlinedoc/913/docMainpage.jsp
• SAS 9.2 : support.sas.com/cdlsearch?ct=80000
L’organisation de l’aide en ligne de SAS 9.2 diffère de l’aide installée sur votre ordina-
teur. L’aide SAS 8.2 de par son organisation reste intéressante à utiliser lorsque vous
consultez la page d’aide consacrée à une instruction de procédure, vous avez la possi-
bilité de revenir au chapitre auquel appartient la procédure, contrairement aux aides
de SAS 9.x.

1. L’exercice 3.1 proposé dans la section 3.1.3. est tout à fait typique des questions posées à cet examen.
SAS Livre Page 6 Jeudi, 18. septembre 2008 6:03 18

6 ◆ SAS

Vous avez aussi accès à un ensemble de documentations techniques qui ne sont pas
comprises dans l’aide. SAS France propose des documentations en français à partir de
son propre site support :
www.sas.com/france/services/support/

SAS : une communauté active d’utilisateurs


Si l’aide SAS doit toujours être votre référence lorsque vous recherchez une information
sur une procédure ou une commande, les exemples qu’elle vous propose sont générale-
ment simples et ne vous permettent pas toujours d’apprécier la richesse et les possibilités
offertes par une procédure particulière. Il est toujours intéressant de s’éloigner de
l’aide SAS pour regarder ce que d’autres utilisateurs peuvent faire avec SAS.
Les utilisateurs de SAS forment une communauté très active et il existe, essentielle-
ment basés aux États-Unis, de très nombreux groupes d’utilisateurs au premier rang
desquels se trouve SAS Global Forum (anciennement SUGI – SAS User Group Inter-
national) : www.support.sas.com/events/sasglobalforum/
Ce groupe d’utilisateurs organise chaque année une conférence internationale au
cours de laquelle des articles d’utilisateurs illustrant les possibilités de telle ou telle
procédure sont exposés avant d’être mis à la disposition des utilisateurs SAS du
monde entier.
Vous pouvez aisément consulter ces articles sur le site suivant : www.lexjansen.com/
Ce dernier site vous permet aussi de consulter les articles rédigés dans le cadre des
groupes régionaux basés aux États-Unis1 :
Enfin, à partir de ce site, vous avez aussi la possibilité de consulter les articles présen-
tés au cours des conférences de deux groupes d’utilisateurs de l’industrie pharmaceu-
tique :
• PharmaSUG (The Pharmaceutical Industry SAS Users Group) :
www.pharmasug.org/
• PhUSE (Pharmaceutical Users Software Exchange) basé en Europe :
www.phuse.eu/
Les forums de discussion constituent aussi une source de renseignements appréciable.
Un forum très actif et existant depuis 1996 est hébergé par l’université de Géorgie :
• Forum SAS-L : www.listserv.uga.edu/archives/sas-l.html
SAS Institute héberge aussi son propre forum : support.sas.com/forums/index.jspa
Attention, cependant, il s’agit là d’un forum d’utilisateurs qui ne saurait se substituer
au support technique offert par SAS et que chaque client SAS (sauf les clients
ACADEMIC) peut saisir en cas de problème. Le support SAS peut être contacté à
cette adresse : support.sas.com/techsup/
À l’heure actuelle, il existe peu de forums à accès gratuit en langue française. Vous
pouvez cependant entrer en contact moyennant un abonnement annuel avec d’autres
utilisateurs français, participer au Club utilisateurs annuel de deux jours, à la journée
SAS Forum Tech, et accéder à l’extranet utilisateurs ainsi qu’à son forum sur le site
SAS FORUM France : www.sas.com/france/sasforum/

1. SESUG, MWSUG, NESUG, SCSUG, WUSS, et PNWSUG.


SAS Livre Page 7 Jeudi, 18. septembre 2008 6:03 18

Introduction ◆ 7

Vous trouverez aussi sur le forum développez.net une section consacrée à SAS :
www.developpez.net/forums/forumdisplay.php?f=886
Vous pouvez aussi consulter le très intéressant blog de Véronique Bourcier consacré à
SAS : www.sasreference.fr
Divers groupes d’utilisateurs sont aussi présents sur Internet. Vous pouvez par exem-
ple consulter les archives et contacter les utilisateurs du groupe Google
http://groups.google.fr/group/comp.soft-sys.sas/topics
SAS Institute soutient l’activité des groupes d’utilisateurs et prend en considération les
expériences des utilisateurs du système SAS. L’existence du SASware BALLOT est une
expression de cet intérêt. Chaque année, SAS Institute demande aux utilisateurs quels
ajouts ils souhaiteraient. Pour plus de détails sur le SASware BALLOT, vous pouvez
consulter le lien support.sas.com/community/ballot/

Les différentes versions de SAS


Vous devez vous demander si cet ouvrage est adapté à la version de SAS que vous avez
à disposition. En effet, différentes versions de SAS existent ou ont existé. SAS Institute
distingue les versions principales (SAS 6.12, SAS 8.2 et SAS 9.2) des versions intermé-
diaires.
Le passage d’une version à une autre est toujours synonyme d’ajouts importants. Les
ajouts qui concernent l’objet de cet ouvrage sont peu nombreux et seront signalés.
ODS est cependant un cas particulier. ODS a été introduit avec SAS 8.0 en 1999. De
très nombreuses modifications et améliorations ont été apportées depuis et certains
programmes, notamment dans la partie consacrée à ODS PDF, peuvent ne pas fonc-
tionner avec des versions antérieures à SAS 9.2.
Vous trouverez sur le site compagnon de cet ouvrage des versions des programmes
proposés dans le chapitre 8 compatibles avec SAS 9.1.3. Nous tentons aussi, dans la
mesure du possible, de proposer des versions compatibles avec SAS 8.2.
Le système SAS est conçu de telle manière qu’un programme qui fonctionne dans une
version donnée fonctionnera aussi dans les versions ultérieures de SAS. Certaines
anciennes fonctions, remplacées depuis par des fonctions plus puissantes, même si
elles ne sont plus documentées, continuent et continueront à pouvoir être utilisées.
Le passage d’une version à une autre n’est donc pas synonyme d’un complet réap-
prentissage de SAS : ce que vous apprenez aujourd’hui sera encore valable demain.
SAS est loué par votre employeur, votre école ou votre université : il n’y a pas de coût
supplémentaire demandé au client SAS lorsqu’une nouvelle version apparaît. Seules
les contraintes propres aux clients1 peuvent expliquer le maintien d’une version rela-
tivement ancienne de SAS. Vous comprenez donc que différentes versions de SAS
peuvent subsister à un moment donné du temps : on peut ainsi considérer qu’actuel-
lement, trois versions de SAS coexistent : SAS 8.2, SAS 9.1.3 et SAS 9.2.
SAS 9.2 a commencé à être déployé et distribué au printemps 2008. Le déploiement
complet de SAS 9.2 doit se terminer courant 2009 avec la livraison des outils
d’analyse propres aux métadonnées. Lorsque SAS 9.2 sera totalement déployé,
SAS 9.1.3. disparaîtra.

1. Notamment en matière de tests suite à la migration des données entre différentes versions.
SAS Livre Page 8 Jeudi, 18. septembre 2008 6:03 18

8 ◆ SAS

SAS Windows, Unix, OpenVMS, z/OS


Cet ouvrage traitera exclusivement de SAS Windows. En effet, si vous débutez sous
SAS, il y a de très fortes chances que la version de SAS à votre disposition soit une
version Windows. Si, par la suite, vous êtes appelé à travailler dans un environnement
non Windows, vous découvrirez que les différences entre votre SAS Windows et SAS
dans un autre environnement résident dans :
• la façon de débuter une session SAS ;
• l’adressage des fichiers externes à SAS ;
• l’existence de quelques options spécifiques à votre environnement.
Les programmes écrits au moyen de SAS Windows fonctionneront parfaitement sur
d’autres systèmes d’exploitation. Il n’y a quasiment aucune différence entre SAS
Windows et les versions UNIX, OpenVMS et z/OS de SAS.

Disposer du système SAS


Si vous êtes actuellement dans une université ou une école, il se peut que la formation
que vous suivez soit inscrite au programme SAS ACADEMIC1. L’inscription à ce
programme permet à votre formation de bénéficier d’un certain nombre de licences
SAS à un coût tout à fait intéressant et autorise l’installation sur votre ordinateur
personnel de SAS pendant la durée de votre formation initiale (y compris pendant la
durée de votre stage) contre une inscription au Club ACADEMIC de SAS et la signa-
ture d’un contrat de licence. Pour tous renseignements sur SAS ACADEMIC, vous
pouvez consulter le site suivant : www.sas.com/france/academic/
Si vous ne pouvez bénéficier de l’offre SAS ACADEMIC, vous avez la possibilité
de découvrir et de travailler sur une version limitée de SAS (SAS Learning
Edition 4.1), suffisante pour l’apprentissage de SAS proposé par cet ouvrage – le
site support.sas.com/learn/le/ fournit toutes les informations dont vous pouvez
avoir besoin.
Cette version allégée de SAS contient les modules suivants : Base SAS (V9.1.3 SP4),
SAS/STAT, SAS/GRAPH, SAS/QC, SAS/ETS et SAS entreprise guide 4.12. Cette
version restreint l’affichage et les manipulations aux 1 500 premières lignes de votre
table3. Le nombre de variables n’est pas limité.
Ce programme a une durée de vie limitée (au moment où est rédigée cette introduc-
tion, la version 4.1 de SAS Learning Edition est programmée pour ne plus fonction-
ner après le 31 décembre 2011) et n’est pas gratuit. Le coût est tout à fait raisonnable
(60 $ sans la documentation en anglais si vous êtes étudiant, 160 € avec la documen-
tation dans les autres cas). Cette version de SAS n’est pas compatible avec Microsoft
Windows® Vista™.

1. Environ 100 établissements et 200 filières sont actuellement partenaire SAS au travers du programme SAS
ACADEMIC.
2. Certaines procédures propres aux modules cités ne sont pas contenues dans cette version.
3. Toutes les tables utilisées dans cet ouvrage contiennent moins de 1 500 observations.
SAS Livre Page 9 Jeudi, 18. septembre 2008 6:03 18

Introduction ◆ 9

Conventions typographiques
Les programmes (instructions, noms de variable, noms de tables) que vous pour-
rez écrire dans SAS peuvent employer minuscules et majuscules. Seules les valeurs
prises par les modalités des variables alphanumériques doivent respecter la casse.
Nous avons cependant employé dans cet ouvrage les majuscules et les minuscules de
façon à vous aider au mieux dans votre compréhension des nombreux programmes
proposés.
Tous les mots clés propres au langage SAS apparaissent en majuscules dans les
programmes et dans le corps du texte. Les mots qui apparaissent en gras dans les
programmes sont les instructions qui débutent et qui terminent une étape (ici, DATA
et RUN). À l’intérieur du programme, les instructions propres au langage SAS appa-
raissent en majuscules (SET, IF, THEN, DO, RANUNI, etc.). Les noms des tables, des
variables, des FORMAT et INFORMAT qui apparaissent dans le programme seront
systématiquement écrits en minuscules. Nous indiquons par l’emploi des minuscules
que le programme fonctionnera tout aussi bien si vous utilisez d’autres noms pour les
tables ou les variables.
DATA test2;
SET test;
FORMAT date ddmmyy.;
ATTRIB x FORMAT=8.4
LABEL="Variable analysée";
IF x<15 THEN DO;
x7=RANUNI(234);
x9=x2+x12;
END;
RUN;
Dans le corps du texte, seront systématiquement repris en majuscules les noms des
commandes, fonctions, options, mais aussi le nom des variables, des FORMAT,
INFORMAT, etc.
Les programmes seront indentés afin de vous permettre de mieux suivre et de
mieux comprendre leur finalité. Il y a toujours au moins un niveau d’indentation,
parfois plusieurs. Dans le cas du programme présenté ici, pour la commande
ATTRIB, nous indentons une seconde fois pour signifier au lecteur que l’instruc-
tion LABEL est un élément de la commande ATTRIB. Nous indentons une seconde
fois après l’instruction IF pour indiquer au lecteur que les deux instructions
permettant de définir les variables X7 et X9 ne s’appliquent pas à toutes les obser-
vations (cette construction est en fait conditionnée au respect de la condition énon-
cée par l’instruction IF). L’instruction CARDS et les données qui suivent cette
instruction ne seront pas indentées.
Il n’est pas forcément nécessaire d’organiser les programmes de cette manière mais au
fur et à mesure que les programmes que vous rédigerez s’allongeront, vous constaterez
qu’une telle organisation facilite grandement la compréhension.
À l’exception de certains programmes très courts, les programmes proposés dans
l’ouvrage sont numérotés, ce qui vous permet de les retrouver facilement sur le site
compagnon de cet ouvrage.
SAS Livre Page 10 Jeudi, 18. septembre 2008 6:03 18

10 ◆ SAS

Un peu d’histoire
Le logiciel SAS est le fruit du travail d’un groupe de chercheurs de la North Carolina
State University débuté en 1966. En 1967, James H. Goodnight, actuel CEO de SAS
Institute, rejoint le projet et travaille à la stabilité du logiciel et à la création des
procédures. Ce logiciel a connu à partir de 1971 un grand succès aussi bien auprès
de la communauté universitaire qu’auprès de l’industrie pharmaceutique et de
l’agriculture, en raison notamment de sa capacité à gérer les données manquantes.
En 1976, l’entreprise SAS Institute est créée notamment par James H. Goodnight
et John P. Sall. SAS s’est depuis imposé comme le leader mondial de l’informati-
que décisionnelle. Il est aujourd’hui présent dans 96 des 100 premières entreprises
du classement Fortune Global 500® et dans près de 44 000 sites clients répartis
dans 107 pays. SAS Institute a réalisé un chiffre d’affaires de 2,15 milliards de
dollars en 2007 dont 21 % a été réinvesti dans la recherche.
SAS signifiait à l’origine Statistical Analysis System. La signification de l’acronyme
a depuis été perdue, marquant ainsi le fait que SAS est beaucoup plus de nos jours
qu’un simple logiciel de traitement statistique. Le logiciel SAS en tant que tel
n’existe plus ; il faudrait plutôt parler d’un système SAS, ou d’un progiciel SAS,
composé de logiciels SAS intégrés.

Les modules du système SAS explorés


Le système SAS est composé de différents modules ayant tous une fonctionnalité
propre. Le module Base SAS constitue le cœur de votre système SAS – il est néces-
saire au fonctionnement des autres produits SAS.
Il permet de plus l’exécution des étapes DATA, du langage macro, des outils offerts
par ODS (Output Delivery System), ainsi que les analyses statistiques simples, les
procédures utilitaires comme PROC CONTENTS, PROC PRINT ou PROC
SORT. Nous consacrerons l’essentiel de cet ouvrage à l’exploration des fonction-
nalités de Base SAS. Le langage SAS est un langage dit de quatrième génération
(L4G). Il s’agit, comme nous allons le découvrir dans cet ouvrage, d’un langage
peu technique, très proche de la syntaxe naturelle.
SAS/GRAPH est le second module que nous explorerons dans cet ouvrage. Cette
application permet de créer des graphiques et, depuis SAS 9.2 et l’introduction
d’ODS GRAPHICS, d’intégrer automatiquement des graphiques prédéterminés
dans les sorties des procédures d’analyses.

Une présentation succincte d’autres modules de SAS1


SAS/ACCESS permet d’accéder aux données produites par d’autres logiciels, de
les utiliser dans SAS et même de créer à partir de SAS des fichiers dans des formats
externes. SAS/ACCESS propose différents modules qui permettent une intégra-
tion à différents systèmes de gestion de base de données (SGBD) du marché et à
certains progiciels de gestion intégré (PGI ou ERP – Enterprise Resource Planning).
Voici une liste d’exemples non exhaustive : SAS/ACCESS Interface to SAP BW, to
Teradata, to DB2, to MySQL, to ODBC, to OLE DB, to ORACLE, to PC Files
(Microsoft Excel, Microsoft Access, Lotus 1-2-3, DBF), to PeopleSoft, etc.

1. Merci à Grégoire de Lassence pour l’aide apportée à la rédaction de cet encadré.


SAS Livre Page 11 Jeudi, 18. septembre 2008 6:03 18

Introduction ◆ 11

SAS AppDev Studio est l’outil de développement de SAS permettant notamment


de :
• créer des interfaces clientes ;
• créer des servlets, des applets, pour construire des applications clientes sur les
technologies Web ;
• créer des portlets pour compléter le portail ;
• créer des plug-in à ajouter aux clients Java ;
• développer des applications analytiques et de pilotage en client léger, Java ou
Windows ;
• exploiter au mieux la puissance du serveur SAS dans des applications de pilo-
tage sur mesure ;
SAS AppDev Studio constitue un environnement de développement complet et
autonome pour concevoir tous types d’applications.
SAS/CONNECT permet de connecter des ordinateurs sur lesquels est installé
SAS. Vous partagerez au moyen de cette application vos tables de données ; des
programmes écrits sur un ordinateur pourront être exécutés sur un second.
SAS Data Integration Studio est une interface cliente Java de la plate-forme déci-
sionnelle SAS. Elle fait partie des packages « SAS Data Integration Server » et
« SAS Enterprise Data Integration Server ». Plus de détails peuvent être obtenus à
l’adresse www.sas.com/france/software/technologies/dw.html.
SAS Enterprise Guide permet de manipuler des données, de faire des analyses
statistiques et des rapports. Cette application développée en .NET est donc une
application uniquement Windows. Enterprise Guide génère du code SAS, qui est
exécuté par un moteur SAS base. SAS Enterprise Guide ne peut être utilisé sans
une connexion à un socle Base SAS.
SAS Enterprise Miner est le module de Data Mining de SAS. C’est une « usine » à
modèle permettant l’industrialisation de l’exploitation intensive de gigantesques
bases de données.
SAS/ETS (Econometrics, Times Series) est le module qui comprend les outils
pour l’économétrie des séries temporelles et la prévision (ARIMA, VARMAX,
TIMESERIES…).
SAS High Performance Forecasting est une application d’aide à la production de
prévisions.
SAS/IML (Interactive Matrix Language) permet d’utiliser un langage matriciel.
SAS/INSIGHT est un outil de visualisation des données.
Ce module est remplacé depuis SAS 9.2 par SAS Stat Studio (www.support.sas.com
/rnd/app/studio/studio.html).
SAS/Integration Technologies permet de partager des ressources et d’intégrer
SAS dans vos diverses autres applications.
SAS/IntrNet permet l’implémentation de vos applications SAS sur Internet.
SAS/IRP (Inventory Replenishment Planning) est un outil de gestion des stocks.
SAS Livre Page 12 Jeudi, 18. septembre 2008 6:03 18

12 ◆ SAS

SAS NLS (National Language Support) n’est pas un module en tant que tel mais une
application qui permet à SAS de fonctionner au mieux sur des systèmes non améri-
cains.
SAS OLAP Server est un SGBD1 multidimensionnel.
SAS Open Metadata Architecture est une architecture permettant la mise en
place, le déploiement et l’administration de la plate-forme SAS.
SAS/OR (Operational Research) regroupe des fonctions avancées de recherche
opérationnelle comme la programmation (linéaire ou non) et la résolution
d’optimisation de graphe.
SAS/SHARE permet l’accès de plusieurs utilisateurs à une même table de
données.
SAS/STAT offre les outils de l’analyse statistique comme l’analyse de la variance et
la plupart des formes de régression.
Vous pouvez accéder à des descriptifs complets des produits et des solutions
proposés par le système SAS sur le site de SAS Institute :
www.sas.com/products/

1. Système de gestion de bases de données.


SAS Livre Page 13 Jeudi, 18. septembre 2008 6:03 18

1
Créer une table SAS

Au sommaire de ce chapitre :
1.1. Faisons connaissance avec SAS
1.2. Les tables SAS
1.3. Cas simple : les informations sont séparées par un espace
1.4. Comprenons bien le cas simple
1.5. Les valeurs manquantes sur variables numériques
Ce premier chapitre a pour objectif de vous aider dans vos premiers pas sous SAS. Il
s’agit plus particulièrement de vous présenter l’environnement SAS et de vous
apprendre à créer vos premières tables.

1.1 Faisons connaissance avec SAS


Au démarrage de SAS, l’écran de la figure 1.1 apparaît.

Figure 1.1 • Capture d’écran SAS Windows.


SAS Livre Page 14 Jeudi, 18. septembre 2008 6:03 18

14 ◆ SAS

Cet écran, typique des versions 8 et 9 de SAS Windows, est désigné sous le terme de
Display Manager System (DMS). Il est composé de cinq fenêtres principales :
• La fenêtre EDITEUR. Cette fenêtre permet de saisir les programmes et d’en
demander l’exécution. Dans l’éditeur amélioré qui s’affiche à l’écran, les diffé-
rentes commandes que vous saisissez s’affichent dans diverses couleurs. La signifi-
cation de ces couleurs est précisée plus loin dans ce chapitre.
• La fenêtre JOURNAL. Dans cette fenêtre, s’affichent les commentaires de SAS sur
les programmes que vous exécuterez.
• La fenêtre SORTIE. Les sorties demandées par vos programmes seront dirigées
vers cette fenêtre.
• La fenêtre EXPLORATEUR. Comme l’explorateur de votre ordinateur, cette
fenêtre vous permet de naviguer dans vos diverses bibliothèques (voir section 1.3.4)
et votre Poste de travail. Vous retrouvez dans Dossiers favoris les dossiers Mes docu-
ments et le Bureau. Dans le dossier Raccourcis de fichiers, vous pouvez créer des
raccourcis vers différents fichiers de votre disque dur. De façon à organiser au
mieux votre travail, n’hésitez pas à personnaliser le contenu de ces dossiers.
• La fenêtre RESULTATS. Cette fenêtre permet de naviguer entre les divers résultats
qui vont s’afficher dans la fenêtre SORTIE et d’effacer certaines sorties pour ne
conserver que les plus utiles.
Les graphiques que vous allez produire vont être envoyés dans une nouvelle fenêtre
GRAPH. Les sorties générées par ODS (voir chapitre 8) sont envoyées dans une
fenêtre RESULTS VIEWER et peuvent être aussi envoyées en même temps dans
la fenêtre SORTIE.

Figure 1.2 • La fenêtre COMMANDE et le menu.

En fonction de la fenêtre active (fenêtre qui s’affiche avec un bandeau bleu foncé –
voir figure 1.1), le menu peut différer de celui représenté à la figure 1.2 (fenêtre
EDITEUR active).
• Fichier permet d’ouvrir ou de sauvegarder un programme, d’importer ou
d’exporter une table, d’imprimer ou de terminer une session SAS.
• Edition propose les commandes d’édition habituelles : Annuler/Rétablir, Copier,
Coller, Rechercher, Remplacer, Sélectionner tout, Effacer la sélection ou la fenêtre.
Ce menu permet également d’afficher le programme dans sa forme réduite ou
développée.
• Affichage permet de naviguer entre les diverses fenêtres, d’en ouvrir de nouvelles,
de rouvrir des fenêtres que vous aviez fermées.
• Outils permet l’accès à différents éditeurs (requêtes, éditeur de tables, de graphiques,
de rapports…). C’est dans ce menu que vous accédez aux commandes de person-
nalisation de la barre d’outils et à différentes options.
• Executer vous permet de demander l’exécution de votre programme et de vous
connecter si votre SAS fonctionne en mode client-serveur.
SAS Livre Page 15 Jeudi, 18. septembre 2008 6:03 18

Créer une table SAS ◆ 15

• Solutions permet d’accéder à un ensemble d’outils d’analyse.


• Fenêtre vous permet un ensemble d’options relatives à l’organisation de vos fenê-
tres sur votre écran. À partir de ce menu, vous pouvez aussi passer d’une fenêtre à
une autre.
• Aide permet d’accéder à l’aide SAS.
Dans la barre d’outils, vous disposez d’une fenêtre COMMANDE qui nous sera parti-
culièrement utile lorsque nous traiterons des graphiques et des sorties ODS. Les
icônes situées à droite de cette zone de commande ont respectivement les fonctions
suivantes : Nouveau, Ouvrir, Enregistrer, Imprimer, Aperçu avant impression,
Couper, Copier, Coller, Annuler, Nouvelle bibliothèque, Explorateur SAS, Soumettre,
Supprimer tout, Interrompre, Aide SAS. Une info-bulle vous indique la fonction de
l’icône lorsque vous passez le pointeur de votre souris dessus.

1.2 Les tables SAS


Dans le vocabulaire SAS, le terme « table » indique le fichier dans lequel sont stockées
les données que vous allez analyser. Vous pouvez imaginer une table SAS comme un
tableau avec :
• en colonnes, les variables (âge, sexe, diplôme…) ;
• en lignes, les observations (des individus, des périodes…).
Si vous ne regardez qu’une colonne, vous verrez l’ensemble des modalités que peut
prendre une variable au sein de votre population. Sur une ligne, vous verrez les
modalités prises par toutes les variables pour une observation donnée.
Afin de mieux comprendre la structure d’une table de données, nous avons ouvert au
moyen de l’EXPLORATEUR la table CLASS, livrée avec SAS 9.1 et 9.2. Pour ouvrir
cette table, allez dans la fenêtre EXPLORATEUR, double-cliquez sur BIBLIOTHEQUE,
puis sur SASHELP et enfin sur CLASS.

Figure 1.3 • Ouvrir une table dans la fenêtre VIEWTABLE.


SAS Livre Page 16 Jeudi, 18. septembre 2008 6:03 18

16 ◆ SAS

Les variables contenues dans cette table sont NAME, SEX, AGE, HEIGHT et WEIGHT.
Les observations sont relatives à des individus. Cette table en contient 19. Sur la
figure 1.3, le nom de la table sur le bandeau est préfixé par le nom de la bibliothèque
dans laquelle est stockée cette table (voir section 1.3.4).
Cet éditeur de table ne doit pas être confondu avec un tableur. Il est possible d’apporter
certaines modifications à la table via la fenêtre VIEWTABLE (modification de certaines
valeurs, tris, mises en forme…), mais pour toutes modifications majeures, vous devrez
passer par une étape DATA et donc par l’écriture d’un programme dans la fenêtre
EDITEUR.
Avant de modifier une table et de créer les variables dont vous aurez besoin, vous
devez créer une table. Cette étape de création est extrêmement importante puisqu’elle
conditionne votre résultat final : si votre table n’est pas le reflet exact des données
dont vous disposez, les analyses que vous pourrez mener par la suite n’auront aucune
valeur. SAS offre des outils qui vous permettent de vous assurer que votre table est
bien une fidèle reproduction de vos données originales. Ces divers outils seront
présentés dans la conclusion du chapitre 2.
Nous allons voir dans ce premier chapitre comment, dans le cas le plus simple, créer
une table SAS à partir de données. Les données que vous souhaitez voir transformées
en une table SAS peuvent prendre deux formes : soit elles sont déjà dans un fichier
informatique, soit elles sont sur une feuille de papier et vous devez les entrer dans la
fenêtre EDITEUR.
Nous allons traiter ce dernier cas, que vous rencontrerez très rarement, en premier.
Vous pourrez ainsi vous familiariser avec les tables SAS et comprendre comment SAS
interprète les données qui lui sont soumises.

1.3 Cas simple : les informations sont séparées


par un espace
Dans cette section, nous allons créer nos premières tables SAS. Au-delà de ce travail,
il s’agit aussi d’approfondir notre connaissance du fonctionnement de SAS et son
environnement. L’exécution de notre premier programme nous permettra de nous
familiariser avec l’EDITEUR SAS et les bibliothèques.

1.3.1 Créons notre première table SAS


Programme 1.1

DATA test;
INPUT x1 x2 x3 x4 x5 $;
CARDS;
78 5 5 1161 ABÉLIEN
35 6 3 1336 ALMÉRIC
82 1 5 1499 ANIEL
;RUN;

Nous sommes ici dans le cas le plus simple : il y a cinq variables à saisir (X1 X2 X3 X4
X5) et vous observez la présence de cinq modalités par observations (78 5 5 1161
ABÉLIEN pour la première observation). Les modalités à saisir sont séparées les unes
SAS Livre Page 17 Jeudi, 18. septembre 2008 6:03 18

Créer une table SAS ◆ 17

des autres par un espace1. Sur chaque ligne du programme, apparaissent les modalités
prises par les variables pour une observation (et une seule).
DATA test;
Cette instruction demande à SAS de créer une table que l’on va appeler TEST. Cette
commande, comme TOUTES les commandes de SAS, se termine par un « ; ». Si vous
oubliez de conclure une instruction par un point-virgule, le programme ne s’exécu-
tera pas. Au début, 80 % des erreurs de programmation que vous rencontrerez seront
liées à des « ; » oubliés.
Le nom d’une table ne doit pas excéder 32 caractères. Vous pouvez utiliser toutes les
lettres non accentuées et le signe « _ ». Il peut contenir des chiffres mais ne doit pas
débuter par un chiffre. SAS ne fait pas la distinction entre les majuscules et les
minuscules. La table TEST est donc parfaitement équivalente à la table test. Si, au
moyen de l’EXPLORATEUR, vous recherchez votre table TEST, celle-ci est placée
dans la bibliothèque WORK et a pour nom ‘Test’. Pour écrire le programme, vous
pouvez employer aussi bien les majuscules que les minuscules. La mise en forme du
programme n’a aucune importance : vous pouvez ajouter autant d’espaces ou de
sauts de lignes que vous le souhaitez entre, par exemple, les termes DATA et TEST.
INPUT x1 x2 x3 x4 x5 $;
Dans cette table TEST, il y a cinq variables. X1, X2, X3 et X4 sont des variables
numériques, X5 est une variable alphanumérique (du texte) – on indique à SAS
qu’une variable est alphanumérique en ajoutant le signe « $ » après son nom. INPUT
est une instruction essentielle puisqu’elle permet à SAS de comprendre la structure
des données brutes qu’il va devoir transformer en une table SAS. Nous disposons,
comme nous le verrons par la suite, d’un ensemble d’options qui indiqueront la
structure et la nature de ces données, et comment elles doivent être interprétées pour
pouvoir être utilisées dans une table SAS.
Vos variables peuvent prendre à peu près n’importe quel nom. Celui-ci ne doit pas
dépasser 32 caractères (les versions plus anciennes de SAS n’acceptaient que des
noms de variables de 8 caractères au maximum). Le nom de votre variable peut
contenir des lettres non accentuées, des chiffres et le signe « _ ». En revanche, les
signes %, $, !, *, &, #, @ sont à proscrire. Le nom de votre variable ne peut pas
commencer par un chiffre.
En ce qui concerne les noms des variables, SAS ne fait aucune différence entre les
majuscules et les minuscules. SAS ne fait pas de distinction entre les variables TOTO
et toto, ce qui implique que vous ne pouvez pas, au sein d’une même table, créer à la
fois une variable X1 et une variable x1.
Si, au moment de la création de la table, vous déclarez la création d’une variable
« ToTo », SAS écrira systématiquement « ToTo » dans ses sorties lorsqu’il y aura invo-
cation de cette variable, mais vous pourrez appeler sans aucune difficulté cette variable
lors de procédures ultérieures au moyen de toto, TOTO, tOtO, TotO, etc.
Avant SAS 9, vous ne pouviez avoir au maximum que 32 767 variables dans
une table SAS. Avec les versions 9 de SAS, seul votre ordinateur vous limite.

1. Si vos modalités sont séparées par plusieurs espaces, cela ne change rien. Si vous ajoutez des espaces
dans le programme 1.1, par exemple, la table sera parfaitement créée.
SAS Livre Page 18 Jeudi, 18. septembre 2008 6:03 18

18 ◆ SAS

Le nombre d’observations que vous pouvez inclure dans une table SAS est illimité.
Une fois de plus, seules les capacités de votre ordinateur limiteront le nombre d’obser-
vations de votre table. À titre de comparaison, une feuille Excel 2003 ne comprend que
256 colonnes et 65 536 lignes1.
Le séparateur décimal interne à SAS est le point : 3.14. Si vous ne précisez pas
l’INFORMAT (voir section 2.8.) qui permet de faire comprendre à SAS des données
avec le séparateur décimal virgule, « 3,14 » ne sera pas compris comme un chiffre.
CARDS;
Au moyen de cette instruction, vous indiquez ici à SAS que les données arrivent. Vous
pouvez aussi utiliser l’instruction DATALINES.
78 5 5 1161 ABÉLIEN
35 6 3 1336 ALMÉRIC
82 1 5 1499 ANIEL
Voici donc les données : les observations sont présentées en lignes. Pour le premier
individu X1=78, X2=5, X3=5, X4=1161 et X5 (variable alphanumérique)=ABÉLIEN.
;RUN;
Nous avons déjà indiqué qu’une commande SAS prend généralement fin avec un
« ; ». Lorsqu’on constitue une table SAS, il est important de situer le point-virgule
qui marque la fin de l’arrivée des données sur la ligne qui suit la dernière donnée.
Vous perdez la dernière ligne de données si, au lieu de
82 1 5 1499 ANIEL
;RUN;
vous entrez :
82 1 5 1499 ANIEL;
RUN;
Vous remarquerez que, dans ce cas, le fond jaune caractéristique des plages de saisie
des données a disparu et que les données numériques apparaissent en sarcelle (bleu-
vert moyen). En général, SAS n’accorde aucune importance aux retours chariot.
Faites cependant attention au retour chariot dans les parties de programmes où sont
présentées les données. Dans certains cas, vous pourriez avoir une table différente de
vos données originales.
L’instruction RUN qui clôt le programme n’est pas obligatoire si vous utilisez une
instruction CARDS (ou DATALINES). Votre programme sera parfaitement exécuté
sans celui-ci mais vous devrez le soumettre jusqu’au point-virgule placé sur la ligne
après la dernière ligne de données.

1.3.2 L’éditeur SAS : une aide à la programmation


SAS est conscient que son langage de programmation peut être compliqué et vous aide
en affichant certains mots dans des couleurs différentes. Il est important de prendre
garde aux couleurs prises par les différents éléments de votre programme puisqu’elles
peuvent, avant même que vous ne soumettiez votre programme, vous indiquer si
celui-ci à des chances d’être exécuté correctement ou pas.

1. 1 048 576 lignes et 16 384 colonnes dans la version 2007.


SAS Livre Page 19 Jeudi, 18. septembre 2008 6:03 18

Créer une table SAS ◆ 19

La lecture seule de ce livre en noir et blanc ne vous éclairera pas beaucoup quant aux
différentes couleurs que vous rencontrerez dans votre éditeur. Merci de reproduire
dans votre éditeur SAS le programme 1.21.
Programme 1.2

* programme de création de la table test;


/* le programme */
DATA test;
INPUT x1 8.4 x2 ddmmyy.;
INFILE 'c:\mes documents\test.txt';
VAR x1;
IMPUT x2;
IF x1=1 THEN z1="texte";
FORMAT x1 8.4;
CARDS;
1 2
3 4
;RUN;

PROC PRINT DATA=test;


VAR x1;
RUN;

%MACRO print ;
%LET texte=test;
PROC PRINT;RUN;
%MEND ;

%print

En vert apparaissent les commentaires que vous avez introduits dans vos programmes.
Ils sont introduits :
• au moyen d’un astérisque (*) – le commentaire prend alors fin au premier « ; »
rencontré ;
• au moyen de « /* » – le commentaire prend alors fin lorsque vous entrez la chaîne
« */ ».
Les mots clés ouvrant et fermant les étapes (DATA/RUN, PROC/RUN et
%MACRO/%MEND) apparaissent en bleu et en gras. À l’intérieur des étapes DATA
et PROC, les instructions propres à l’étape sont reconnues par l’éditeur et s’affichent
en bleu clair (INPUT, INFILE, IF, THEN, FORMAT, CARDS pour l’étape DATA –
VAR et DATA pour l’étape PROC PRINT). Les instructions VAR et IMPUT de l’étape
DATA ne sont pas reconnues par l’éditeur et apparaissent en rouge dans le
programme (VAR parce que cette instruction n’est pas possible dans l’étape DATA et
IMPUT parce que cette instruction n’existe pas – les erreurs de frappe dans les noms
des instructions peuvent donc être repérées).
Les chaînes de caractères entre quotes, simples ou doubles, sont reprises en violet.
Elles indiquent soit un chemin vers un fichier externe, soit la modalité d’une variable
alphanumérique. La zone de saisie des données est présentée avec un fond jaune.
Les noms des INFORMAT (DDMMYY.), des FORMAT et des constantes numériques
(1 dans la ligne débutant par IF) apparaissent en sarcelle (bleu-vert moyen).

1. Ce programme peut aussi être téléchargé sur le site compagnon de cet ouvrage : www.sas-sr.com.
SAS Livre Page 20 Jeudi, 18. septembre 2008 6:03 18

20 ◆ SAS

Les constantes numériques apparaissent de plus toujours en gras ; c’est également le


cas de certains FORMAT ou INFORMAT (de type W.D : 8.4)1.
Les autres éléments des programmes de l’étape DATA et PROC apparaissent en noir :
il s’agit soit des noms des tables créées ou utilisées (TEST), ou des variables (X1, X2, Z1).
La programmation macro présente des singularités : le texte à l’intérieur des macro-
programmes apparaît généralement en noir non gras, sauf les éléments propres au
langage macro. Ces éléments débutent généralement par le signe % (%LET dans le
programme 1.2) et apparaissent en bleu.
Il est important d’observer les couleurs prises par le texte. En cas de rouge, il est
parfaitement inutile de soumettre votre programme. Si le mot PROC ne devait pas
apparaître en bleu et en gras, relisez votre programme et trouvez-en la raison avant
toute demande d’exécution (retirez le point-virgule placé juste avant PROC PRINT,
par exemple).

Figure 1.4 • Capture d’écran du programme 1.1.

Dans l’éditeur, un signe apparaît systématiquement à gauche de la commande


DATA ou PROC de début d’étape. En cliquant sur ce symbole, vous avez la possibilité
de réduire et de développer chaque étape DATA ou PROC.

1.3.3 Demander l’exécution d’un programme


Une fois le programme saisi, il convient de demander à SAS de l’exécuter. Ceci peut
être fait de plusieurs manières mais dans tous les cas, vous devez au préalable sélec-
tionner votre programme de la même manière que vous sélectionnez un texte dans
votre traitement de texte. Pour demander l’exécution de votre programme, vous avez
plusieurs possibilités :
• Vous appuyez sur la touche F3 de votre clavier.
• Vous cliquez sur l’icône située sur la barre d’outils.
• Vous sélectionnez la commande Soumettre du menu Exécuter.
• Vous cliquez du bouton droit et choisissez dans la zone de l’éditeur Soumettre
sélection ou Soumettre tout.
• Pour les programmes qui utilisent beaucoup de ressources, vous avez aussi la pos-
sibilité de demander une exécution en mode BATCH. Vous devez saisir votre
programme, puis l’enregistrer sur votre disque dur. Terminez votre session SAS

1. Les INFORMAT sont traités dans la section 2.8., les FORMAT sont présentés dans la section 5.3.
SAS Livre Page 21 Jeudi, 18. septembre 2008 6:03 18

Créer une table SAS ◆ 21

(quittez SAS) et, au moyen de l’explorateur Windows, retrouvez votre pro-


gramme sur votre disque dur. Cliquez du bouton droit et sélectionnez Batch
Submit with SAS 9.2.

Figure 1.5 • L’exécution d’un programme en mode Batch.

Si vous ne sélectionnez pas votre programme et si vous demandez une exécution,


toutes les lignes de programme saisies dans la fenêtre EDITEUR seront exécutées
(même les parties de programme que vous ne voulez pas exécuter). Si votre
programme disparaît (c’est possible avec certaines versions de SAS), tapez sur la
touche F4 ou demandez dans le menu Exécuter/Rappeler la dernière exécution pour
le faire réapparaître.
Si, pour une raison ou une autre, vous souhaitez interrompre le programme, vous
pouvez soit appuyer simultanément sur Ctrl et Pause ou, dans la barre d’outils, sur le
bouton . Dans tous les cas, la fenêtre présentée à la figure 1.6 apparaîtra.

Figure 1.6 • Interrompre un programme SAS – première étape.

Confirmez l’annulation de l’exécution de votre programme (voir figure 1.7).

Figure 1.7 • Interrompre un programme SAS – seconde étape.


SAS Livre Page 22 Jeudi, 18. septembre 2008 6:03 18

22 ◆ SAS

Merci de soumettre maintenant à SAS le programme 1.1 présenté précédemment.


Rien ne semble se passer. C’est une fausse impression. Passez dans la fenêtre JOUR-
NAL. Si SAS a correctement exécuté votre programme, vous devez voir votre
programme s’afficher en noir, ainsi que des commentaires. Tant que ces commen-
taires sont en bleu, tout va bien. Si vous voyez du vert, c’est qu’il y a eu un « petit »
problème : SAS a quand même exécuté votre programme mais il se pose des ques-
tions quant à la pertinence de celui-ci. Si vous voyez du rouge, c’est qu’il y a eu une
erreur de programmation majeure. Le programme n’a pas été exécuté.
Lorsque vous examinez votre fenêtre JOURNAL, il convient de commencer à lire à
partir du début du programme : une erreur qui apparaît en fin de
programme peut être due à une erreur intervenue plus tôt. Si vous vous focalisez
uniquement sur la dernière erreur, il est bien possible que jamais vous ne trouviez
pourquoi le programme n’a pas fonctionné. Ces erreurs sont généralement de
trois types :
• Vous avez mal orthographié certains mots clés.
• Des « ; » sont manquants ou non valides.
• Vous faites appel à des options ou à des commandes non valides.
Vous devez ensuite systématiquement vérifier que votre table est bien conforme aux
données originales. Si votre table ne comprend pas trop d’observations, vous pouvez
utiliser la procédure PROC PRINT :
PROC PRINT DATA=test;
RUN;
Chaque procédure de SAS effectue une tâche bien précise. La procédure PRINT
demande par exemple l’impression de la table. Maintenant, quelle que soit la procé-
dure employée, vous aurez toujours le même type de syntaxe :
PROC XXXXX DATA=xxxxx options;
Lignes de commandes;
RUN;
Si vous ne faites pas intervenir d’options au niveau de la commande de procédure
(PROC XXXX), vous pouvez ne pas indiquer la table sur laquelle vous voulez exécuter
cette procédure. Elle sera alors exécutée sur la dernière table créée.
Sur votre fenêtre SORTIE apparaît la table telle que SAS l’a comprise. Pour limiter le
nombre d’observations (imaginez ce qui se passe si votre table comprend quelques
millions d’observations), vous pouvez spécifier le nombre d’observations à envoyer
dans la fenêtre SORTIE.
PROC PRINT DATA=test (OBS=10);
RUN;
Dans le cas présent, les dix premières observations seront envoyées dans votre fenêtre
SORTIE. Si vous souhaitez voir les dix dernières observations, regardez dans un
premier temps le nombre d’observations de votre table. Celui-ci est indiqué dans la
fenêtre JOURNAL lors de la création de votre table. Imaginons que celui-ci soit égal à
150000. Ensuite :
PROC PRINT DATA=test (FIRSTOBS=149990);
RUN;
SAS Livre Page 23 Jeudi, 18. septembre 2008 6:03 18

Créer une table SAS ◆ 23

Pour imprimer les observations 9990 à 10000 :


PROC PRINT DATA=test (FIRSTOBS=9990 OBS=10000);
RUN;
La valeur donnée à OBS est nécessairement supérieure à celle donnée à FIRSTOBS.

1.3.4 Les bibliothèques


Si tout se passe bien lors de la phase de création de la table, SAS vous donne ce type de
message dans la fenêtre JOURNAL :
NOTE: The data set WORK.TEST has 3 observations and 5 variables.
Cela signifie qu’il a créé une table TEST dans la bibliothèque WORK. Par défaut, vous
disposez de quatre bibliothèques : WORK, SASHELP, SASUSER et MAPS1. Pour
accéder au contenu de ces bibliothèques, cliquez sur l’onglet EXPLORATEUR, puis
double-cliquez sur BIBLIOTHEQUES.

Figure 1.8 • Les bibliothèques.

La bibliothèque MAPS contient les fonds de cartes que vous pouvez utiliser dans la
procédure graphique GMAP. La bibliothèque SASHELP contient les tables qui vous
permettent de refaire les exemples proposés dans l’aide. Elle contient également un
certain nombre de fichiers nécessaires au bon fonctionnement de SAS. Vous ne
pouvez rien écrire dans ces bibliothèques.
La bibliothèque SASUSER contient les informations qui sont propres à l’utilisateur.
WORK est la bibliothèque temporaire, vidée de son contenu lorsque vous quittez
SAS. C’est dans cette bibliothèque que seront placées, par défaut, les tables que vous
allez créer au cours d’une session. Si vous souhaitez conserver cette table pour une
utilisation ultérieure, vous devez la placer dans une bibliothèque permanente.
La commande DATA TEST est parfaitement équivalente à la commande DATA
WORK.TEST. Vous trouverez dans l’aide SAS ou sur Internet de très nombreux
programmes dans lesquels les auteurs précisent systématiquement la bibliothèque
WORK pour indiquer que la table est à placer dans la bibliothèque temporaire. Dans
cet ouvrage, si aucune bibliothèque n’est indiquée, c’est que la table créée ou modifiée
est située dans la bibliothèque temporaire. Pour créer une bibliothèque permanente,
vous pouvez utiliser la commande suivante :
LIBNAME lib 'c:\mes documents';

1. Cette dernière bibliothèque peut ne pas être présente.


SAS Livre Page 24 Jeudi, 18. septembre 2008 6:03 18

24 ◆ SAS

LIBNAME : demande à SAS de créer une bibliothèque permanente. Le nom de cette


bibliothèque est LIB. ‘c:\mes documents\’ est l’emplacement physique, sur votre
disque dur, de cette bibliothèque. La commande LIBNAME fait partie des commandes
qui définissent votre environnement, elle se place en dehors des commandes DATA et
PROC. Le chemin physique doit être encadré par des quotes, simples ou doubles.
Cependant, si dans le nom d’un de vos dossiers cités apparaît une quote, vous devrez
impérativement utiliser des quotes doubles :
LIBNAME toto "C:\intro_SAS\fichiers pour l’analyse" ;
La seule difficulté consiste ici à donner à SAS un chemin DOS correct. Si votre chemin
n’est pas correct, la bibliothèque ne peut pas être créée. Il est possible d’attribuer à une
bibliothèque plusieurs emplacements. Ainsi :
Programme 1.3
LIBNAME lamar ('d:\mes documents\sas exemple' 'c:\mes documents');

Vous pourrez aussi créer une bibliothèque en utilisant l’icône « Nouvelle bibliothèque »
située sur la barre d’outils :

Figure 1.9 • Le bouton Nouvelle bibliothèque.

Autre possibilité : cliquez du bouton droit dans la fenêtre EXPLORATEUR active,


puis sélectionnez Nouveau. La fenêtre présentée à la figure 1.10 apparaîtra.

Figure 1.10 • Création d’une nouvelle bibliothèque.


SAS Livre Page 25 Jeudi, 18. septembre 2008 6:03 18

Créer une table SAS ◆ 25

Vous devez alors préciser le nom, le moteur et le chemin physique de votre bibliothè-
que. En spécifiant un moteur, vous avez la possibilité d’indiquer à SAS quel type de
fichiers il va trouver à l’emplacement physique que vous lui indiquez. Le moteur par
défaut est V9 (pour SAS, version 9)1. En cochant Activer au démarrage, la biblio-
thèque que vous créez sera systématiquement définie à chaque début de session. Si
vous ne cochez pas Activer au démarrage, la bibliothèque sera détruite à la fin de
votre session SAS. Attention, cela ne signifie pas que l’ensemble des tables créées et
placées dans cette bibliothèque vont être détruites, mais que l’association entre le
nom de votre bibliothèque et son emplacement physique sur votre disque dur sera
perdue. Vous aurez toujours la possibilité, au cours d’une session ultérieure, de réal-
louer à cet emplacement physique une bibliothèque, de même nom ou pas, et
d’analyser à nouveau vos tables sauvegardées.
Le nom d’une bibliothèque ne doit pas excéder 32 caractères. Vous pouvez utiliser
toutes les lettres non accentuées et le signe « _ ». Il peut contenir des chiffres mais ne
doit pas débuter par un chiffre.
Si vous avez à spécifier un moteur particulier, vous pouvez aussi le faire au moyen de
la commande LIBNAME.
LIBNAME old V6 'C:\intro_SAS\tables V6 de SAS';
Dans tous les cas, il conviendra de regarder la fenêtre JOURNAL afin de voir si votre
bibliothèque a été correctement créée. Parmi les messages que vous trouverez dans la
fenêtre JOURNAL, vous observerez le message suivant :
Moteur : V9
Cela signifie qu’à cet emplacement, seront à lire et seront écrites des tables enregis-
trées dans le format propre aux versions 7 (très peu distribuée), 8 et 9 de SAS2. Parmi
les moteurs possibles, vous remarquez la présence d’un moteur Excel. Vous devinez
donc qu’il est possible de lire et d’écrire directement au moyen de SAS des fichiers
Excel. Attention cependant : lorsque vous créez une bibliothèque de type Excel, vous
devez spécifier le nom d’un classeur – les feuilles contenues dans le classeur pourront
être ensuite examinées au moyen de SAS. Les noms des feuilles sont cependant diffé-
rents des noms que vous pourrez lire dans la fenêtre EXPLORATEUR3.
Pour placer votre table TEST dans votre bibliothèque, il vous suffit d’exécuter le
programme 1.4.
Programme 1.4

DATA lib.test;
SET test;
RUN;

1. La version SAS 9.2 propose différents moteurs. Dans leurs versions Windows, SAS 9.2 et 9.1.3 proposent
dix moteurs différents (voir l’aide SAS, entrée ENGINE system option). L’accès à ces différents
moteurs dépend des caractéristiques de votre SAS Access.
2. La lecture de tables créées par SAS 6 (sauf celles créées par la version 6.06) et par la version 5 ne pose
pas de difficulté. Pour plus de détails, voir l’aide SAS (entrée library engines, V9 engine).
3. Pour connaître les noms attribués aux feuilles, vous pouvez exécuter le programme suivant :
PROC CONTENTS DATA=old._all_;
RUN;
OLD est ici une bibliothèque de type Excel créée au moyen de la commande :
LIBNAME old EXCEL 'c:\intro_SAS\xls\classeur1.xls';
SAS Livre Page 26 Jeudi, 18. septembre 2008 6:03 18

26 ◆ SAS

La première instruction demande la création d’une table TEST dans la bibliothèque LIB.
La seconde instruction indique que SAS doit utiliser (SET) la table TEST, située actuel-
lement dans la bibliothèque temporaire. Le RUN demande l’exécution du programme.
Dans le cas où votre bibliothèque contient plusieurs chemins physiques, SAS ira
écrire votre table à l’emplacement indiqué par le premier chemin. Dans le cas
LAMAR à double chemin (voir programme 1.3), les tables seront écrites dans ‘d:\mes
documents\sas exemples’.
Des tables peuvent avoir des noms identiques tant qu’elles sont situées dans des biblio-
thèques différentes. À l’issue de l’éxécution du programme 1.4, vous disposez de deux
tables TEST, une dans la bibliothèque WORK et l’autre dans la bibliothèque TOTO. Il est
possible de créer directement la table SAS dans une bibliothèque définie au préalable :

Programme 1.5

DATA toto.test;
INPUT X1 X2 X3 X4 X5 $;
CARDS;
78 5 5 1161 ABÉLIEN
35 6 3 1336 ALMÉRIC
82 1 5 1499 ANIEL
;RUN;

Exercice 1.1 : Voici des données que vous allez devoir entrer dans une table SAS :
a1t23
b 4 abc 5 6
c7z89
d 10 rt 11 12
Combien avez-vous de variables ? d’observations ? Rédigez le programme qui créera
votre table.

1.4 Comprenons bien le cas simple


Avant d’aller plus loin dans la création de tables SAS, voyons ce qui se passe dans les
cas suivants afin de bien comprendre que ce qui suit votre instruction INPUT condi-
tionne votre résultat – nos différents exemples nous permettront aussi d’introduire la
gestion des valeurs manquantes dans une table SAS.

Programme 1.6 Résultat 1.1


DATA test; Obs 4x1 4x2 4x3 4x4 4x5
INPUT x1 x2 x3 x4 x5; 1 1 2 3 4 5
CARDS; 2 6 7 8 9 10
1 2 3 4 5 3 11 12 13 14 15
6 7 8 9 10 4 16 17 18 19 20
11 12 13 14 15 5 21 22 23 24 25
16 17 18 19 20 6 26 27 28 29 30
7 31 32 33 34 35
21 22 23 24 25 8 36 37 38 39 40
26 27 28 29 30 9 41 42 43 44 45
31 32 33 34 35 10 46 47 48 49 50
36 37 38 39 40
41 42 43 44 45
46 47 48 49 50
;RUN;
SAS Livre Page 27 Jeudi, 18. septembre 2008 6:03 18

Créer une table SAS ◆ 27

Le programme 1.6 représente le cas standard : par observation, nous avons cinq
modalités – cinq variables sont déclarées au moyen de la commande INPUT.

Programme 1.7 Résultat 1.2


DATA test; Obs 4x1 4x2 4x3 4
INPUT x1 x2 x3 ; 1 1 2 3
CARDS; 2 6 7 8
3 11 12 13
1 2 3 4 5 4 16 17 18
5 21 22 23
6 7 8 9 10 6 26 27 28
11 12 13 14 15 7 31 32 33
8 36 37 38
16 17 18 19 20 9 41 42 43
21 22 23 24 25 10 46 47 48
26 27 28 29 30
31 32 33 34 35
36 37 38 39 40
41 42 43 44 45
46 47 48 49 50
;RUN;

Dans le programme 1.7, nous indiquons à SAS qu’il a trois variables à saisir : une fois
qu’il a saisi ces trois variables, SAS passe à la ligne de données suivante et néglige les
informations en fin de ligne.

Programme 1.8 Résultat 1.3


DATA test; Obs 4x1 4x2 4x3 4x4 4x5
INPUT x1 x2 x3 x4 x5; 1 1 2 3 4 5
CARDS; 2 6 7 8 9 10
3 11 12 13 14 15
1 4 16 17 18 19 20
5 21 22 23 24 25
2 6 26 27 28 29 30
3 7 31 32 33 34 35
8 36 37 38 39 40
4 9 41 42 43 44 45
… 10 46 47 48 49 50


49
50
;RUN;

Dans le programme 1.8, nous avons indiqué à SAS qu’il avait cinq variables à saisir :
s’il ne trouve pas l’information sur la ligne de données, il passe à la ligne suivante
pour rechercher cette information.
Ces deux exemples doivent malgré tout vous faire comprendre que si, dans votre ligne
INPUT, vous avez spécifié trop ou pas assez de variables par rapport aux informa-
tions contenues dans le bloc CARDS, vous risquez certains problèmes comme le
montre le programme 1.9.
Dans le programme 1.10, il y a bien cinq variables à saisir mais pour certaines obser-
vations, la modalité de la variable X5 est manquante.
SAS Livre Page 28 Jeudi, 18. septembre 2008 6:03 18

28 ◆ SAS

Programme 1.9 Résultat 1.4

DATA test; Obs 4x1 4x2 4x3 4x4 4x5 4x6


INPUT x1 x2 x3 x4 x5 x6; 1 1 2 3 4 5 6
CARDS; 2 11 12 13 14 15 16
1 2 3 4 5 3 21 22 23 24 25 26
4 31 32 33 34 35 36
6 7 8 9 10 5 41 42 43 44 45 46
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
26 27 28 29 30
31 32 33 34 35
36 37 38 39 40
41 42 43 44 45
46 47 48 49 50
;RUN;

Programme 1.10 Résultat 1.5

DATA test; Obs 4x1 4x2 4x3 4x4 4x5


INPUT x1 x2 x3 x4 x5; 1 1 2 3 4 5
CARDS; 2 6 7 8 9 10
1 2 3 4 5 3 11 12 13 14 16
4 21 22 23 24 25
6 7 8 9 10 5 26 27 28 29 31
11 12 13 14 6 36 37 38 39 40
16 17 18 19 20 7 41 42 43 44 46
21 22 23 24 25
26 27 28 29
31 32 33 34 35
36 37 38 39 40
41 42 43 44
46 47 48 49 50
;RUN;

SAS, par défaut, procède donc de la manière suivante : il lira autant de modalités qu’il y
a de variables déclarées dans la commande INPUT, quitte à aller sur la ligne suivante.
Lorsque, pour une observation, il pense avoir connaissance des modalités de toutes les
variables déclarées dans la ligne INPUT, il cesse de lire sur la ligne de données et
commence l’enregistrement de l’observation suivante sur la ligne de données suivante.
Cependant, un certain nombre d’options permettent de modifier le fonctionnement
par défaut de SAS comme nous allons le voir incidemment dans la section suivante.

1.5 Les valeurs manquantes sur variables


numériques
Dans les tables que vous allez construire, certaines de vos variables ne seront pas
renseignées pour certaines observations. Nous avons examiné un cas dans lequel
seules les modalités de la dernière variable peuvent être valeur manquante (voir
programme 1.10). Ce cas est aisément résolu par l’introduction de l’option MISSOVER
dans la commande INFILE.
La commande INFILE indique généralement à SAS qu’il va recevoir ces données d’un
fichier extérieur (voir section 2.1.). Cependant, ici, il n’y a pas de fichier extérieur à
SAS Livre Page 29 Jeudi, 18. septembre 2008 6:03 18

Créer une table SAS ◆ 29

lire et ce que l’on souhaite, c’est pouvoir utiliser une option de cette commande
INFILE. Comme les données arrivent par la fenêtre EDITEUR, vous ajoutez à côté de
cette commande l’option CARDS, puis l’option souhaitée (ici, MISSOVER).

Programme 1.11 Résultat 1.6

DATA test; Obs 4x1 4x2 4x3 4x4 4x5


INFILE CARDS MISSOVER; 1 41 42 43 44 45
INPUT x1 x2 x3 x4 x5; 2 6 7 8 9 10
CARDS; 3 11 12 13 14 .
4 16 17 18 19 20
1 2 3 4 5 5 21 22 23 24 25
6 7 8 9 10 6 26 27 28 29 .
7 31 32 33 34 35
11 12 13 14 8 36 37 38 39 40
16 17 18 19 20 9 41 42 43 44 .
21 22 23 24 25 10 46 47 48 49 50
26 27 28 29
31 32 33 34 35
36 37 38 39 40
41 42 43 44
46 47 48 49 50
;RUN;

Cette option MISSOVER indique à SAS de ne pas rechercher sur la ligne suivante si,
sur une même ligne de données, il observe moins de modalités qu’il n’a de variables
déclarées dans la commande INPUT. C’est une option intéressante puisqu’elle vous
garantit que vous aurez dans votre table autant d’observations que de lignes dans vos
données initiales.
Attention cependant, cette option MISSOVER n’est pas idéale pour résoudre les
problèmes de valeurs manquantes :

Programme 1.12 Résultat 1.7

DATA test; Obs 4x1 4x2 4x3 4x4 4x5


INFILE CARDS MISSOVER; 1 41 42 43 45 4.
INPUT x1 x2 x3 x4 x5; 2 6 7 8 9 10
CARDS; 3 11 12 13 14 .
4 16 17 18 19 20
1 2 3 5 5 21 22 23 24 25
6 7 8 9 10 6 26 27 28 29 .
7 31 32 33 34 35
11 12 13 14 . 8 36 37 38 39 40
16 17 18 19 20 9 41 42 43 44 .
21 22 23 24 25 10 46 47 48 49 50
26 27 28 29 .
31 32 33 34 35
36 37 38 39 40
41 42 43 44 .
46 47 48 49 50
;RUN;

Vous constatez ici que votre table n’est pas à l’image de vos données originales.
L’introduction de l’option MISSOVER ne règle en rien le problème puisque, pour
la première observation, X4 a pour modalité 5 et X5 est déclaré valeur manquante.
C’est exactement le type d’erreur que vous devez absolument éviter.
SAS Livre Page 30 Jeudi, 18. septembre 2008 6:03 18

30 ◆ SAS

Dans le cadre simple qui est le nôtre actuellement (les modalités des variables à saisir
sont séparées par des espaces), il est impératif que les valeurs manquantes soient
marquées par quelque chose :
• soit, comme dans le programme 1.12, par un point (signe par défaut des valeurs
manquantes des variables numériques) ;
• soit, comme dans le programme 1.13, par une lettre quelconque en prenant soin
au préalable de déclarer cette lettre comme signe de valeur manquante.

Programme 1.13 Résultat 1.8

MISSING x; Obs 4x1 4x2 4x3 4x4 4x5


DATA test;
INPUT x1 x2 x3 x4 x5;
CARDS; 1 41 42 43 4x 45
2 46 47 48 49 10
1 2 3 x 5 3 11 12 13 14 .
6 7 8 9 10 4 16 17 18 19 20
11 12 13 14 . 5 21 22 23 24 25
6 26 27 28 29 .
16 17 18 19 20 7 31 32 33 34 35
21 22 23 24 25 8 36 37 38 39 40
26 27 28 29 . 9 41 42 43 44 .
31 32 33 34 35 10 46 47 48 49 50
36 37 38 39 40
41 42 43 44 .
46 47 48 49 50
;RUN;

Cette dernière option peut être intéressante s’il existe plusieurs raisons à une valeur
manquante. Imaginons que votre table reprenne les résultats qu’une enquête effec-
tuée auprès de consommateurs sur les caractéristiques de leur abonnement auprès
des opérateurs de téléphonie mobile. La première question posée est : « Quel est le
nom de votre opérateur de téléphonie mobile ? »
• Certains consommateurs ne vont pas répondre parce qu’ils ne le souhaitent pas.
• D’autres ne répondront pas parce qu’ils ne sont pas concernés par la question
(« je n’ai pas de téléphone portable »)1.
Le traitement à imposer à vos données étant différent en fonction de la raison qui a
poussé le consommateur à ne pas répondre, il peut être utile de distinguer ici les
raisons de cette non-réponse.
Si vous omettez l’instruction MISSING, SAS construira, en l’absence de toute autre
erreur de paramétrage de votre ligne INPUT, une table à l’image de votre fichier
initial à cette différence près que les « x » seront remplacés par des « . ». En effet, vous
avez déclaré dans votre instruction INPUT que les variables sont numériques. Si, lors
de son examen des données, SAS lit autre chose que du numérique, il vous envoie
dans la fenêtre JOURNAL un message de ce type :
NOTE: Données incorrectes pour x4 en ligne 5 7-7.
RÈGLE : ----+----1----+----2----+----3----+----4----+----5----+----6----+----7
5 1 2 3 x 5
x1=1 x2=2 x3=3 x4=. x5=5 _ERROR_=1 _N_=1

1. Nous imaginons ici que la question « Avez-vous un téléphone portable ? » n’a pas été posée, que
l’enquêteur a saisi d’un « x » les réponses « je n’ai pas de téléphone portable » et d’un « . » les non-
répondants.
SAS Livre Page 31 Jeudi, 18. septembre 2008 6:03 18

Créer une table SAS ◆ 31

Ce message signifie : ce que SAS voit pour la variable X4 ne lui convient pas. SAS
vous invite à regarder la ligne 5 de cette fenêtre JOURNAL. Vous pourrez y lire
entre les colonnes 7 et 7 (SAS vous offre une règle et vous envoie vers le « x ») cette
modalité qui ne semble pas convenir pour cette variable que vous avez déclarée
comme étant numérique.
Sur la dernière ligne, on voit ce que SAS a fait de cette modalité : il a transformé le
« x » en une valeur manquante : « . ». La table est tout de même créée mais vous avez
perdu une information précieuse.
Attention enfin à cette instruction MISSING : vous remarquez qu’elle est placée avant
l’instruction DATA. Il s’agit en effet d’une instruction qui modifie le fonctionnement
par défaut de SAS au même titre que l’instruction OPTIONS (voir section 5.6.).
Pendant toute la durée de votre session, « x » sera considéré comme possible signe de
valeur manquante des variables numériques et, si vous avez à créer plusieurs tables au
cours d’une même session, il est possible que vous obteniez des résultats non désirés1.
Nous vous recommandons, une fois la table créée, de revenir au fonctionnement par
défaut de SAS en soumettant l’instruction MISSING;.

1.5.1 Plus de deux modalités aux valeurs manquantes


L’introduction de deux valeurs aux valeurs manquantes permet d’ajouter une infor-
mation qualitative sur la variable. Il peut arriver que la modalité d’une variable soit
manquante pour plus de deux raisons. Admettons que ces raisons soient A, B et
C. Il demeure possible de conserver l’information lors de la création de votre table
SAS et ce, de deux façons :
• Il vous suffit de déclarer plusieurs modalités possibles pour les valeurs manquantes
dans l’instruction MISSING.
MISSING A B C;
• Demandez à la personne qui va créer votre fichier brut à ce que les modalités A, B
et C, pour cette variable, soient précédées d’un point.

Programme 1.14 Programme 1.15 Résultat 1.9

DATA test; MISSING A B C; Obs x1


INPUT x1; DATA test; 1 1
CARDS; INPUT x1; 2 2
1 CARDS; 3 A
4 4
2 1 5 B
.A 2 6 6
7 7
4 A 8 C
.B 4 9 9
6 B
7 6
.C 7
9 C
;RUN; 9
;RUN;

1. Ce sera le cas si, au cours d’une même session, vous soumettez le programme 1.15 et le programme 2.16
(voir section 2.4).
SAS Livre Page 32 Jeudi, 18. septembre 2008 6:03 18

32 ◆ SAS

Votre variable X1 est numérique, vous pourrez donc lui soumettre tous les traite-
ments possibles sur variables numériques tout en conservant votre information de
nature qualitative.

1.5.2 Cas des valeurs manquantes saisies par aucun signe


À ce stade, nous savons donc gérer une valeur manquante si elle est saisie dans les
données originales par un « . » ou par une lettre quelconque. Que faire si elle est saisie
par un espace comme dans l’exemple suivant dans lequel X3 n’est pas renseigné pour
les observations 1 et 3 ?
1 2 4 5
6 7 8 9 10
11 12  14 15
16 17 18 19 20
Il faut déjà espérer que les valeurs manquantes soient toujours saisies par la même
chose (ici, trois espaces). Si tel est le cas, sélectionnez votre zone de données et au
moyen d’un Chercher/Remplacer (menu Édition), remplacez les trois espaces par
« ’espace’ . ‘espace’ ». Vous obtiendrez ainsi :
1 2 . 4 5
6 7 8 9 10
11 12 . 14 15
16 17 18 19 20
Si maintenant, votre enregistrement est de la forme :
15 12 53 48
Vous n’avez aucun moyen de savoir quelle variable est manquante et il y a peu
d’espoir que vous puissiez vous en sortir.

Ce chapitre nous a expliqué comment SAS fonctionne par défaut lorsqu’il crée une
table. Nous avons aussi vu qu’au moyen d’options, il était possible de modifier le
fonctionnement par défaut. Nous pouvons donc nous intéresser maintenant à des cas
moins standard.
SAS Livre Page 33 Jeudi, 18. septembre 2008 6:03 18

2
Pour aller plus loin
dans la création de tables SAS

Au sommaire de ce chapitre :
2.1. La création d’un fichier SAS au moyen d’un fichier informatique
2.2. Autres indicateurs de séparation des modalités
2.3. Les données présentées en colonnes
2.4. Les espaces dans les modalités de variables alphanumériques
2.5. Toutes les observations apparaissent sur une même ligne
2.6. Les modalités relatives à une même observation apparaissent sur plusieurs
lignes
2.7. Retour sur la gestion des valeurs manquantes
2.8. Les INFORMAT : format des valeurs entrantes
2.9. Exportons nos tables SAS
Les données que vous utiliserez pour créer une table SAS n’auront pas toujours la
forme indiquée dans le premier chapitre. Ce deuxième chapitre décrit les outils de
programmation utiles pour traiter des cas s’éloignant du cas simple afin de créer vos
tables SAS.

2.1 La création d’une table SAS à partir


d’un fichier informatique1
Imaginons que vous ayez 10 000 observations à faire entrer dans votre table SAS. Ces
observations sont dans un fichier au format TXT sur votre disque dur. Vous pourriez
ouvrir ce fichier, copier les 10 000 lignes et les coller dans l’éditeur de SAS. La procé-
dure risquerait d’être lourde.
On traitera ce genre de données comme ci-après.

1. Tous les fichiers de données bruts TESTxx.txt sont téléchargeables sur le site compagnon de cet
ouvrage : www.sas-sr.com.
SAS Livre Page 34 Jeudi, 18. septembre 2008 6:03 18

34 ◆ SAS

Programme 2.1

DATA test;
INFILE 'C:\intro_SAS\fichiers\test21.txt';
INPUT X1 X2 X3 X4 X5 $;
RUN;

Dans notre exemple, les valeurs prises par nos différentes variables sont séparées par
un espace.
Après la commande INFILE, vous devez indiquer entre quotes le chemin d’accès à
votre fichier. Ici, le fichier à traiter est un fichier TXT. SAS peut traiter des fichiers
*.DAT ou *.CSV au moyen de la commande INFILE1. Il peut être utile de limiter dans
un premier temps les traitements à un nombre réduit d’observations. Par exemple,
vous avez 100 000 observations mais, dans une phase préparatoire, vous souhaitez
(pour gagner du temps) traiter uniquement un échantillon : vous pouvez limiter le
nombre d’observations à lire au moyen de l’option OBS et aussi préciser quelle ligne
dans le fichier brut considérer pour la première observation grâce à la commande
FIRSTOBS. Attention si vous combinez les deux commandes :
Programme 2.2

DATA test;
INFILE 'C:\intro_SAS\fichiers\test22.txt' OBS=50 FIRSTOBS=20;
INPUT X1 X2 X3 X4 X5 $;
RUN;

Votre table ne présentera que les observations représentées sur les lignes 20 à 50. OBS
sera donc obligatoirement supérieur à FIRSTOBS. La commande OBS=x indique à SAS
de lire jusqu’à la xième ligne du fichier. Ces instructions FIRSTOBS et OBS sont plus utiles
qu’il n’y paraît. Si, par exemple, dans un fichier de 50 lignes à transformer en table SAS,
les deux premières lignes et la dernière ligne sont occupées par des données inutiles.
Programme 2.3

DATA test;
INFILE 'C:\intro_SAS\fichiers\test23.txt' FIRSTOBS=3 OBS=49;
INPUT X1 X2 X3 X4 X5 $;
RUN;

Il est possible que chaque ligne de données dans le fichier brut soit particulièrement
longue. Tant qu’elles contiennent toutes moins de 256 caractères (blancs compris),
cela ne pose pas de problème. Si au moins une ligne devait compter un nombre plus
important de caractères, il convient de l’indiquer à SAS au moyen de l’option LRECL
dans la commande INFILE.
Programme 2.4

DATA test;
INFILE 'C:\intro_SAS\fichiers\test24.txt' LRECL=600;
INPUT X1-X200;
RUN;

1. TXT, CSV et DAT sont les formats les plus usuels. La commande INFILE peut gérer d’autres formats.
Consultez l’aide SAS pour plus d’informations.
SAS Livre Page 35 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 35

Dans le cas présent, 200 variables numériques sont à créer. Elles ont toutes des moda-
lités comprises entre 10 et 99 et un espace sépare chaque modalité. Un enregistrement
(une ligne de données) contient donc 200 * 2 + 199 = 599 caractères.
Comment être sûr que SAS a lu l’intégralité de la ligne de données et comment savoir
sans ouvrir le fichier que vous n’avez pas besoin de l’option LRECL ? Lorsque vous
créez une table SAS, dans la fenêtre JOURNAL, vous aurez, parmi les messages en
bleu, le commentaire suivant :
NOTE: 6 records were read from the infile ‘C:\intro_SAS\fichiers\bourvil2.txt’.
The minimum record length was 30.
The maximum record length was 41.

SAS vous indique ici que la longueur maximale des enregistrements qu’il a traités est
de 41 caractères : vous n’avez pas besoin de l’option LRECL. S’il devait indiquer 256,
cela signifierait pour vous l’obligation de spécifier un LRECL suffisamment grand
pour pouvoir lire dans la fenêtre JOURNAL un « maximum record length » inférieur
au LRECL spécifié.
Vous disposez aussi d’un module d’importation des données accessible via le menu
Fichier, puis Importer des données. Ce module vous permet d’importer des fichiers
Excel, Access, Dbase, Lotus 1 2 3, ou des fichiers au format CSV et TXT. Pour que
vous puissiez utiliser ce module d’importation, il faut que vos données soient
« propres » : elles doivent pouvoir être rentrées telles quelles dans SAS. L’utilisation de
ce module d’importation est très simple et vous êtes invité à le découvrir par vous-
même. Ce module est particulièrement utile lorsque votre séparateur de modalités est
la tabulation comme nous le verrons par la suite.
L’utilisation de la commande INFILE oblige pour l’instant l’écriture du chemin DOS
complet vers le fichier que vous souhaitez voir transformé en une table SAS. Même en
utilisant l’explorateur Windows pour copier ce lien, puis le coller dans l’éditeur,
l’écriture du chemin DOS peut être fastidieuse si au cours d’une même session, vous
devez créer plusieurs tables. L’instruction FILENAME peut simplifier votre travail.
Comme l’instruction LIBNAME, FILENAME agit sur votre environnement et doit
donc être exécutée en dehors des étapes DATA ou PROC.
FILENAME brut 'C:\intro_SAS\fichiers';
La commande FILENAME permet de préciser un dossier dans lequel est stocké
l’ensemble des fichiers que vous souhaitez transformer en tables SAS. Nous
nommons ce dossier « brut ». Lors de la création de la table, vous pouvez directement
faire référence à ce dossier au moyen de la programmation suivante :
DATA test;
INFILE brut(test_A.txt);
…;
RUN;
L’instruction FILENAME peut aussi faire référence à un fichier (et non pas à un
emplacement physique). Ainsi :
FILENAME fichier 'C:\intro_SAS\fichiers\test_B.txt';
L’étape de création de votre table commencera alors de la manière suivante :
DATA test;
INFILE fichier;
…;
RUN;
SAS Livre Page 36 Jeudi, 18. septembre 2008 6:03 18

36 ◆ SAS

2.2 Autres indicateurs de séparation


des modalités
Nous avons vu que le séparateur de modalités par défaut était l’espace. Vous rencontrerez
très certainement des fichiers bruts dans lesquels un autre séparateur de modalités sera
utilisé. Des options d’INFILE vous permettront de traiter parfaitement ce type de
fichiers. Si vos données sont présentes dans votre fenêtre EDITEUR, vous pourrez
toujours mobiliser les options d’INFILE via la commande
INFILE CARDS votre_option ;

2.2.1 Les modalités sont séparées par des tabulations


Imaginons que les modalités soient séparées par des tabulations (ce sera le cas dans
votre fenêtre EDITEUR si vous copiez-collez d’Excel vers SAS). Si vous passez par une
instruction CARDS, cela ne pose aucun problème, votre programmation ne changera
pas et la table sera parfaitement créée.
Programme 2.5

DATA test;
INPUT X1 X2 X3 X4 X5 $;
CARDS;
78 5 5 1161 ABÉLIEN
35 6 3 1336 ALMÉRIC
82 1 5 1499 ANIEL
;RUN;

En revanche, si vous cherchez à créer une table SAS à partir d’un fichier externe à
SAS, il vous faudra utiliser la commande INFILE et l’option EXPANDTABS :
Programme 2.6

DATA test;
INFILE 'C:\intro_SAS\fichiers\test26.txt' EXPANDTABS;
INPUT X1 X2 X3 X4 X5 $;
RUN;

Soyez prudent si le séparateur est une tabulation. Vous trouverez parmi les fichiers
exemples de cet ouvrage un fichier appelé TEST100.TXT qui comprend 9 observa-
tions et 100 variables. Pour la première observation, les 100 variables sont toutes
égales à 1 ; pour la deuxième, elles sont toutes égales à 2 ; pour la troisième, elles sont
toutes égales à 3, etc. Pour chaque observation, vous pourriez considérer que la
longueur de l’enregistrement est égale à 199 (100 caractères et 99 tabulations). Si
vous demandez à créer une table à partir de ce fichier, le programme que vous allez
écrire sera le suivant :

Programme 2.7

DATA test;
INFILE 'C:\intro_SAS\fichiers\test100.txt' EXPANDTABS;
INPUT x1-x100;
RUN;
SAS Livre Page 37 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 37

Vous regardez votre fenêtre JOURNAL et vous lirez, parmi d’autres informations :
NOTE: 9 enregistrements lus dans infile ‘C:\intro_SAS\test100.txt’.
La longueur min. de l’enregistrement était 199.
La longueur max. de l’enregistrement était 199.

Puis, immédiatement en dessous :


Une ou plusieurs lignes ont été tronquées.
NOTE: SAS est allé à la ligne lorsque l’instruction INPUT a atteint la fin d’une ligne.
NOTE: La table WORK.TEST a 2 observations et 100 variables.

La table n’a pas été correctement créée puisque vous n’avez pas les 9 observations
prévues. SAS vous indique qu’il a tronqué une ou plusieurs lignes. Demandez main-
tenant, au moyen d’un PROC PRINT, l’édition de la table que vous venez de créer.
Vous constaterez qu’effectivement, il y a un problème.
Les remarques reprises dans le JOURNAL sont symptomatiques d’une longueur
d’enregistrement supérieure aux 256 caractères prévus par défaut. Il se trouve cepen-
dant que SAS vous indique que la longueur maximale de vos enregistrements est
égale à 199.
Lorsque la tabulation est utilisée comme séparateur de modalités, dans le JOURNAL,
une tabulation compte pour un caractère. Cependant, en interne à SAS, une tabula-
tion compte pour 7 caractères. Votre longueur d’enregistrement est donc non pas de
199 caractères mais de 100 + 99 * 7 caractères = 793 caractères. En spécifiant
LRECL=793 (ou plus), votre table sera parfaitement créée – si vous indiquez
LRECL=792, votre table ne sera pas identique à votre fichier brut de départ.
Assurez-vous donc de spécifier une longueur d’enregistrement suffisamment grande.
La longueur de l’enregistrement que vous lirez dans la fenêtre JOURNAL, si elle est
différente de 256 caractères1, ne peut vous être utile que pour calculer le nombre
minimal de caractères à considérer pour LRECL en utilisant cette formule :
(nombre de variables créées -1)*7 + (longueur max. de l’enregistrement déclarée
dans la fenêtre JOURNAL – nombre de variables créées – 1)

2.2.2 Les modalités sont séparées par des virgules


Si les valeurs sont séparées par une virgule (1,2,3…), vous utiliserez l’option DSD.
Programme 2.8

DATA test;
INFILE 'C:\intro_SAS\fichiers\test28.txt' DSD;
INPUT X1 X2 X3 X4 X5 $;
RUN;

Nous reviendrons sur les possibilités de cette commande DSD par la suite.

1. Si la longueur de l’enregistrement est égale à 256, cela signifie que SAS a cessé sa lecture au bout de
256 caractères. Vous pouvez dans un premier temps spécifier un LRECL plus élevé – il faut nécessai-
rement que votre LRECL soit supérieur à la longueur maximale de votre enregistrement et que, simul-
tanément, SAS ne vous dise pas qu’une ou plusieurs lignes ont été tronquées.
SAS Livre Page 38 Jeudi, 18. septembre 2008 6:03 18

38 ◆ SAS

2.2.3 Les modalités sont séparées par un caractère quelconque


Si les valeurs sont séparées par un caractère autre que ceux déjà évoqués (1?2?3?…
par exemple), vous utiliserez l’option DLM et indiquerez entre quotes le caractère
utilisé :
Programme 2.9

DATA test;
INFILE 'c:\intro_SAS\fichiers\test29.txt' DLM='?';
INPUT X1 X2 X3 X4 X5 $;
RUN;

Attention cependant à cette commande DLM. Vous devez choisir un caractère de


séparation qui n’apparaîtra pas au sein des modalités des variables que vous voulez
créer. La solution qui consiste à choisir deux caractères rares n’est pas valide comme
le montre le programme 2.10.
Programme 2.10

DATA test;
INFILE CARDS DLM='@#';
INPUT email $ com $;
CARDS;
[email protected]@#A
;RUN;

Les données brutes sont composées d’une adresse e-mail et d’une seconde variable
COM. Si vous exécutez ce programme, vous constaterez qu’il ne fonctionne pas
comme nous le souhaitions. Un PROC PRINT donne en effet :
Obs email com
1 a esa.fr

Lorsque vous indiquez deux caractères, cela signifie en fait que les séparateurs
peuvent être l’un des deux caractères : via l’instruction DLM, vous offrez à SAS une
liste des séparateurs de modalités possibles. Des codes clavier Alt permettent de créer
des caractères rares – voir par exemple ce site pour une liste des codes possibles :
www.toutimages.com/codes_caracteres.htm
Pour créer un caractère rare, il suffit de taper le code à quatre chiffres correspondant
tout en maintenant enfoncée la touche Alt de votre clavier. Par exemple :
(Alt 0222 : le Thorn islandais majuscule). Il ne vous reste plus qu’à rechercher-
remplacer les deux (ou plus) caractères par le caractère que vous avez choisi.

2.2.4 Les modalités sont séparées par un point-virgule


Étant donné la signification du point-virgule pour SAS, il n’est pas conseillé de l’utili-
ser pour séparer les modalités. Si vos données sont dans un fichier, une commande
INFILE accompagnée de l’option DLM=‘;’ suffira. (Vous pouvez essayer avec le
fichier d’accompagnement POINTVIRGULE.TXT.) Si les données que vous avez à
transformer en table sont dans la fenêtre EDITEUR, vous devrez utiliser conjoin-
tement DLM et l’instruction CARDS4 ou DATALINES4.
SAS Livre Page 39 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 39

Programme 2.11

DATA test;
INFILE CARDS DLM=';';
INPUT x1 x2 x3 x4 x5;
CARDS4;
1;2;3;4;5
1;2;3;4;5
;;;;
RUN;

Insérez « ;;;; » avant votre RUN habituel afin d’indiquer à SAS que la plage de données
à saisir est terminée.

2.3 Les données présentées en colonnes


Deux principaux formats d’enregistrement des données bruts existent : les données
formatées en colonnes (COLUMN INPUT) et les données non formatées (LIST
INPUT). Nous verrons que les données formatées en colonnes présentent plusieurs
avantages, le premier d’entre eux étant la possibilité de saisir des modalités alpha-
numériques contenant des espaces.

2.3.1 Premier cas : l’absence d’espace entre les modalités


Dans le cas où aucun séparateur de modalités n’existe, vous ne pourrez rien faire si
vos données brutes ont la forme suivante :
123456albert
123jean-pierre
123456789martine
Trois variables sont à saisir dans cet exemple. Rien ne nous permet de savoir où
commencent et où terminent les modalités de chacune des variables. Lorsque les
données sont formatées en colonnes, on dispose d’infomations quant à l’emplace-
ment réservé aux modalités de chacune des variables au sein de l’enregistrement.

Programme 2.12

DATA test3;
INPUT x1 1-5 x2 6-10 x3 11 x4 12-16 x5 $ 17-23;
CARDS;
0005900002101028ABÉLIEN
0006700005100615ALMÉRIC
0000200004301371ADÉLIEN
;RUN;

Nous disposons d’enregistrements de longueur 23 (23 caractères). Dans la commande


INPUT, nous indiquons à SAS que la variable X1 est numérique et qu’elle a pour
valeur ce qui est observé sur les cinq premiers caractères, entre la colonne 1 et la
colonne 5. X2 va du 6e au 10e caractère, X5 est alphanumérique et sa valeur est
présentée entre les 17e et 23e caractères. On peut donc tracer « à la règle » des colonnes
SAS Livre Page 40 Jeudi, 18. septembre 2008 6:03 18

40 ◆ SAS

dans nos données : dans chaque colonne apparaît une variable. Le premier exemple
cité plus haut ne peut pas être traité parce que vous ne pouvez pas tracer de traits
verticaux pour délimiter les différentes modalités.
Exercice 2.1 : Créez une table SAS en utilisant les données ci-dessous pour obtenir la
table ci-contre :

123456789abc Obs x1 x2 x3 x4
1 123 45 6789 abc
987654321def 2 987 65 4321 def
253698741ghi 3 253 69 8741 ghi
879654321jkl 4 879 65 4321 jkl
5 324 57 8961 lmn
324578961lmn 6 524 16 9387 opq
524169387opq

2.3.2 Cas général


Les données présentées en colonnes ont généralement la forme suivante :
----+----1----+----2----+----3----+----4----+----5----+----6
la grande vadrouille Louis de Funès 16 1966 A V 7
le mur de l’atlantique Jean Poiret 14 1970 AB 6
le cercle rouge Alain Delon 20 1970 Z A 8
le corniaud Louis de Funès 14 1965 SD 4
le chanteur de mexico Luis Mariano 12 1956 A B 5
la traversée de Paris Jean Gabin 19 1958 S 2
La règle ne fait pas partie des données mais permet de lire les positions prises par les
diverses modalités. Les données apparaissent donc ici en colonnes. Le titre occupe
les colonnes 1 à 22. De la colonne 25 à la colonne 38 apparaît le nom de l’acteur qui
partage l’affiche avec Bourvil. Une note (subjective) au film en question occupe les
colonnes 40 et 41. L’année de sortie du film est comprise entre les colonnes 45 et 48.
Les colonnes 50 à 52 affichent un code de trois lettres au maximum pouvant contenir
un blanc. Enfin, un numéro d’ordre se trouve en colonne 551.
Une petite fenêtre, située dans le coin inférieur droit de votre fenêtre EDITEUR, vous
indique la ligne (Ln) sur laquelle vous vous trouvez ainsi que le numéro de la colonne
(Col) qui suit votre curseur. Vous pouvez ainsi repérer facilement les colonnes qui
contiennent vos modalités. Si vos données sont présentes dans un fichier extérieur,
vous avez la possibilité d’utiliser les outils FSLIST et NOTEPAD introduits dans la
conclusion des chapitres 1 et 2.
Si vous entrez les commandes classiques pour traiter ce fichier, cela ne fonctionnera
pas essentiellement parce que vous avez à saisir une variable alphanumérique parti-
culière : le titre du film, composé de plusieurs mots, séparés par des espaces.

Programme 2.13

DATA bourvil;
INPUT film $ acteur $ note annee code $ ordre;
CARDS;
la grande vadrouille Louis de Funès 16 1966 A V 7

1. Les données utilisées dans cette section sont reprises dans le fichier bourvil.txt que vous pouvez télé-
charger sur le site compagnon de cet ouvrage.
SAS Livre Page 41 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 41

le mur de l’atlantique Jean Poiret 14 1970 AB 6


le cercle rouge Alain Delon 20 1970 Z A 8
le corniaud Louis de Funès 14 1965 SD 4
le chanteur de mexico Luis Mariano 12 1956 A B 5
la traversée de Paris Jean Gabin 19 1958 S 2
;RUN;

Le résultat 2.1 reprend les résultats obtenus du PROC PRINT.

Résultat 2.1

Obs film acteur note annee code ordre

1 la grande . . de .
2 le mur . . Jean .
3 le cercle . . Delon 20
4 le corniaud . . Funès 14
5 le chanteur . . Luis .
6 la traversé . . Jean .

Par défaut, SAS considère que les modalités sont séparées par des espaces et les carac-
téristiques de votre instruction INPUT font que SAS pense qu’il doit avoir une appro-
che par défaut. Il enregistre donc dans la variable FILM ce qu’il voit jusqu’à ce qu’il
rencontre un espace, enregistre pour ACTEUR le deuxième mot du titre, tente
d’enregistrer dans une variable numérique le troisième mot du titre ou le prénom de
l’acteur si le titre ne comprend que deux mots et renvoie donc une valeur manquante.
Idem pour l’année, etc.
Ici, puisque les données sont présentées en colonnes, il convient d’adapter votre
programmation en spécifiant soit les emplacements par colonne des variables,
soit l’INFORMAT (voir section 2.8.) de la variable à saisir. Votre ligne INPUT devient
ainsi :
INPUT film $ 1-22 acteur $ 25-38 note annee code $ 50-52 ordre ;

Votre table SAS sera parfaitement créée. Nous sommes ici proches du cas examiné par
le programme 2.12. Nous aurions pu aussi préciser dans la ligne INPUT l’emplace-
ment des variables NOTE, ANNEE et ORDRE. En fait, cela n’est pas utile puisque,
par exemple, lorsque SAS a terminé l’enregistrement de la variable ACTEUR, il passe
systématiquement les blancs qui peuvent suivre pour ne commencer l’enregistrement
de la variable NOTE que lorsque celle-ci commence effectivement. Étant donné que
les trois variables ne comprennent pas de blanc dans leur modalité, forcer la lecture
entre telle et telle colonne ne serait pas utile parce que les variables sont enregistrées
dans un ordre identique à celui de l’enregistrement.
Si vous souhaitez que vos variables soient enregistrées dans un ordre différent de celui
de l’enregistrement, cela ne pose pas de réel problème si vous spécifiez pour chaque
variable les colonnes entre lesquelles SAS devra lire l’information. Ainsi, la ligne
d’INPUT suivante organise vos données dans votre table d’une manière peut-être
plus utile pour vous :
INPUT ordre 55 acteur $ 25-38 film $ 1-22 annee 45-48 note 40-41 code $ 50-52 ;
SAS Livre Page 42 Jeudi, 18. septembre 2008 6:03 18

42 ◆ SAS

2.3.4 Le positionnement relatif


Afin d’indiquer à SAS la position de vos modalités, vous pouvez soit indiquer les
colonnes qui contiennent les données (positionnement absolu), soit adopter un posi-
tionnement relatif :
INPUT film $ 1-22 +2 acteur $ 25-38 +1 note +2 annee
code $ 50-52 +2 ordre ;
Rappel de l’allure de l’enregistrement :
----+----1----+----2----+----3----+----4----+----5----+----6
la grande vadrouille Louis de Funès 16 1966 A V 7
L’instruction INPUT demande à SAS de lire la variable FILM entre les colonnes 1 et 22,
de se déplacer ensuite de 2 colonnes (+2), de lire (donc à partir de la 25e colonne) la
variable ACTEUR entre les colonnes 25 et 38, puis la variable NOTE dont l’enregistre-
ment prend fin dès qu’est passé l’espace qui suit cette note. Ensuite, SAS doit passer
deux colonnes et lire ANNEE. Une colonne après commence CODE, variable alpha-
numérique de 3 caractères. SAS doit enfin sauter deux colonnes pour lire ORDRE.
La programmation proposée ici n’a aucun intérêt et est même dangereuse. Il faut bien
comprendre comment se passe l’enregistrement d’une modalité pour voir le caractère
dangereux de ce type de programme.
Lorsque vous enregistrez la variable ACTEUR, vous précisez à SAS qu’il doit enregis-
trer pour cette variable ce qu’il observe entre les colonnes 25 et 38. Dans ce cas, SAS
n’a pas besoin d’un espace pour clore l’enregistrement ; vous pouvez donc lui deman-
der de se déplacer d’une colonne (il passe donc la colonne 39) et de commencer à
enregistrer la note. Maintenant, pour clore l’enregistrement de NOTE, puisque vous
n’avez rien précisé de particulier, SAS a besoin de l’espace qui suit pour clore son
enregistrement. Il passe donc l’espace en 42e colonne, et doit se déplacer de deux
colonnes pour enregistrer l’année.
Si vous n’y prenez pas garde, vous serez tenté de mettre un +3. Or, ce faisant, il commen-
cera l’enregistrement de l’année en 46e colonne (et produira donc 966 au lieu de 1966).
Par conséquent, si vous souhaitez utiliser les possibilités offertes par les commandes de
type +X au sein de l’instruction INPUT, vous devrez toujours vous demander si SAS a
besoin de l’espace qui suit la modalité pour clore la saisie de cette modalité. Vous saurez
ainsi où est votre curseur et pourrez déterminer le nombre de colonnes à sauter.
Ensuite, la démarche est qualifiée d’inutile. En effet, il n’y a pas de problème particulier
ici qui justifie l’utilisation des +X. Cette procédure présente un réel intérêt quand, par
exemple, une partie de votre enregistrement est à négliger. Si vous souhaitez que la note
que vous avez donnée à un film n’apparaisse pas dans votre table SAS, la ligne d’INPUT
suivante demandera à SAS de ne pas lire cette information :
INPUT film $ 1-22 +2 acteur $ 25-38 +6 annee code $ 50-52 +2 ordre;
Toujours si vos données sont formatées en colonnes, vous pouvez éviter d’utiliser
cette commande +X au moyen de la ligne d’INPUT suivante :
INPUT film $ 1-22 +2 acteur $ 25-38 annee 45-48 code $ 50-52 +2 ordre;
Enfin, si vos données ne sont pas formatées en colonnes, l’utilisation de +X ne sera
possible que si la variable à écarter présente des modalités qui prennent toujours le
même nombre de caractères. Si cela n’est pas le cas, il conviendra de saisir la variable
à écarter, puis de l’effacer au moyen d’une commande DROP.
SAS Livre Page 43 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 43

Programme 2.14

DATA test (DROP=x2);


INPUT X1 X2 X3;
CARDS;
125 12 120
15 654321 4
;RUN;

2.3.5 Un cas particulier : la dernière modalité est de longueur


variable
Imaginons que notre fichier de départ ait cette forme particulière :
Louis de Funès 16 1966 A V 7 la grande vadrouille
Jean Poiret 14 1970 AB 6 le mur de l’atlantique
Alain Delon 20 1970 Z A 8 le cercle rouge
Louis de Funès 14 1965 SD 4 le corniaud
Luis Mariano 12 1956 A B 5 le chanteur de mexico
Jean Gabin 19 1958 S 2 la traversée de Paris
Vous diriez alors : « Aucune différence, nous devons pouvoir passer le même type de
programmation. » Vérifions que cela ne fonctionne pas :
Exercice 2.2 :
1. Transformez les données ci-dessus en table SAS – données à l’écran – vous passez
donc par un CARDS.
2. Adaptez votre programme en retirant CARDS et les lignes de données. (Vous
passez donc par un INFILE. Fichier à utiliser ici : BOURVIL3.TXT.)
À l’issue de cet exercice, vous devez constater que la question 1 ne pose aucun
problème. En revanche, la création de la table au moyen du fichier brut ne se passe
pas bien. En fait, lorsque vous passez par un INFILE, si la dernière variable est alpha-
numérique et de longueur variable (c’est bien le cas ici, puisque les titres n’ont pas
tous le même nombre de caractères), sans l’option TRUNCOVER d’INFILE, SAS lira
« trop de caractères » en prenant au besoin des informations présentes sur la ligne
suivante.
Pour définir les colonnes entre lesquelles vous devez lire le titre du film, vous allez
prendre le titre le plus long et constater qu’il occupe les colonnes 33 à 54. Dans votre
fichier, chaque titre ne prend pas forcément 22 caractères. SAS, pour remplir le titre,
va alors chercher le premier bloc de 22 caractères présent sur une même ligne et passe
pour cela à la ligne suivante. Ceci vous explique pourquoi, lorsque vous demandez un
PROC PRINT, vous observez le résultat 2.2.

Résultat 2.2
Obs acteur note annee code ordre titre
1 Louis de Funès 16 1966 A V 7 Jean Poiret 14 19
2 Alain Delon 20 1970 Z A 8 Louis de Funès 14 19
3 Luis Mariano 12 1956 A B 5 Jean Gabin 19 19

L’option TRUNCOVER indique à SAS de ne pas rechercher sur la ligne suivante si on


lui demande de lire un certain nombre de caractères pour une variable et qu’il ne
SAS Livre Page 44 Jeudi, 18. septembre 2008 6:03 18

44 ◆ SAS

trouve pas exactement ce nombre de caractères. Attention, si l’option TRUNCOVER


vous sera souvent utile lors d’un passage par une commande INFILE pour créer une
table, elle vous sera parfaitement inutile lorsque vous passerez par un CARDS : SAS
ne force pas la lecture sur les lignes suivantes s’il lui manque des caractères lors d’une
entrée de données par CARDS.

2.3.6 Position relative et position absolue des modalités


Lorsque les modalités sont présentées en colonnes, il existe une seconde manière de
noter les positions des variables en position absolue. Ainsi :
INPUT film $ 1-22 acteur $ 25-38 @40 note @45 annee code $ 50-52 @55 ordre;
La commande @X indique à SAS de se positionner en xème colonne pour lire la varia-
ble dont le nom suit. Cette commande évite les calculs nécessaires à l’utilisation des
+X pour passer d’une variable à une autre. Vous devez uniquement connaître la position
où débute la variable.
Les données que nous utilisons dans ce chapitre ne nécessitent pas l’utilisation des
instructions @X. Une instruction @X permet notamment d’écarter une variable lors
de la construction de la table. Dans le même temps, l’utilisation seule de @X ne sera
pas possible si un espace apparaît dans la modalité que vous souhaitez saisir. Ce type
de programmation permet de « revenir en arrière », et d’effectuer un second passage
sur la ligne de données. Ainsi, la ligne INPUT suivante :
INPUT film $ 1-22 acteur $ 25-38 @40 note @45 annee code $ 50-52 @55 ordre @25
prenom $;
Après avoir saisi la variable ORDRE, nous avons demandé à SAS de revenir en arrière
et de se positionner en 25e colonne pour retenir dans la variable PRENOM le prénom
de l’acteur qui partage l’affiche avec Bourvil. Ce genre de manœuvre n’est pas possible
avec la commande +X puisqu’il n’existe pas de commande –X.

2.3.7 Une seconde application de @X


Imaginons que nous disposions des données suivantes :
prénom: Sophie remarque: BB
prénom: Hélène remarque: A
prénom: Julie remarque: CCC
prénom: Marie remarque: AB
prénom: Erwan remarque: AC
prénom: Emilie remarque: DDD
prénom: Valérie remarque: CC
prénom: Sylvain remarque: AC
prénom: Marie remarque: BB
prénom: Claire remarque: A
prénom: Aurélie remarque: CCC
prénom: Sanaa remarque: AB
prénom: Guillaume remarque: AC
prénom: Damien remarque: DDD
prénom: Lucie remarque: CC
prénom: Elodie remarque: AC
prénom: Antoine remarque: AC
prénom: Benjamin remarque: AB
SAS Livre Page 45 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 45

Un bug informatique a créé ce fichier. Vous pouvez malgré tout en faire une table SAS
en profitant des récurrences « prénom: » et « remarque: »
Programme 2.15

DATA test;
INPUT @'prénom:' eleve :$10. @'remarque:' attitude $;
CARDS;

les données
;RUN;

Nous avons ici une seconde application de l’option @ dans une commande INPUT.
Nous avons vu l’intérêt d’un @5 X1 qui indiquait à SAS de se placer en cinquième
colonne pour lire la variable X1, @’prénom:’ ELEVE demande à SAS d’avancer dans
la ligne et de trouver « prenom: » pour ensuite lire la variable ELEVE (le « :$10. » est
un INFORMAT – voir section 2.8.).
Exercice 2.3 : Essayez cette manœuvre dans le fichier ABCD.TXT. Est-ce que le nombre
de lignes du fichier est bien égal au nombre d’observations de votre table ? Modifiez votre
programmation de façon que votre table soit fidèle à votre fichier de départ.

2.4 Les espaces dans les modalités de variables


alphanumériques
Un des avantages aux données formatées en colonnes, c’est qu’elles autorisent des
modalités contenant des espaces. Si les données ne sont pas formatées en colonnes et
si l’espace est le séparateur par défaut, SAS ne pourra pas comprendre la différence
entre l’espace au milieu de la modalité et l’espace qui sépare les modalités de deux
variables distinctes.
Exemple : X2 est numérique et vaut forcément 1 ; le texte avant le 1 est à mettre dans
la variable alphanumérique X1.

Programme 2.16

DATA test;
INPUT X1 $ X2;
CARDS;
aa 1
aa a 1
aa a a 1
;RUN;

Dans le cas présent, vous ne pourrez pas créer votre table SAS1. Si, à l’intérieur des
modalités, vous avez des espaces, vous devez absolument créer une distinction entre
le séparateur de modalités et l’espace qui intervient dans la modalité. Si vous ne

1. Dans le programme 1.15, nous avions introduit l’instruction MISSING A B C ; Si vous exécutez les
programmes 2.16 et 1.15 au cours de la même session, la modalité A continue à être considérée
comme valeur manquante d’une variable numérique et votre variable X2 prendra respectivement les
valeurs 1, A et A – vous n’observez aucun message d’erreur dans votre fenêtre JOURNAL. Pour revenir
au fonctionnement par défaut de SAS, soumettez l’instruction MISSING;.
SAS Livre Page 46 Jeudi, 18. septembre 2008 6:03 18

46 ◆ SAS

disposez que d’un fichier TXT1, c’est manuellement que vous devrez intervenir en
introduisant, par exemple, deux espaces entre le nom de l’acteur et le titre du film.
Programme 2.17

DATA test;
INPUT X1 $ & X2;
CARDS;
aa 1
aa a 1
aa a a 1
;RUN;

Le & placé juste avant la variable X2 indique à SAS d’attendre de voir au moins deux
séparateurs de modalités consécutifs avant de passer à l’enregistrement de la variable
suivante. Vous avez aussi la possibilité d’introduire un autre séparateur de modalités,
ce nouveau séparateur conduisant SAS à considérer l’espace comme un caractère
quelconque :

Programme 2.18

DATA test;
INFILE CARDS DLM='#';
INPUT X1 $ X2;
CARDS;
aa#1
aa a#1
aa a a#1
;RUN;

En revanche, l’utilisation d’une tabulation comme séparateur de modalités ne fonc-


tionnera pas. Dans le fichier TABU.TXT, qui reprend les données ci-dessus, le dièse a
été remplacé par une tabulation. Pour créer une table, a priori, nous exécuterions le
programme 2.19.
Programme 2.19

DATA tabu;
INFILE 'C:\intro_SAS\fichiers\tabu.txt' EXPANDTABS;
INPUT X1 $ X2;
RUN;

Ce programme ne fonctionne pas. L’option EXPANDTABS continue à considérer


l’espace comme un séparateur de modalités. Votre table ressemblera au résultat 2.3.
Résultat 2.3
Obs X1 X2

1 aa 1
2 aa .
3 aa .

1. Bien entendu, si vous disposez d’un fichier Excel, le module d’importation des données (menu
FICHIER/Importer données) remplira parfaitement son office.
SAS Livre Page 47 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 47

Vous devrez ouvrir votre fichier de données avec un traitement de texte quelconque
ou au moyen de NOTEPAD (voir conclusion des chapitres 1 et 2) et remplacer votre
tabulation par un caractère qui vous permette d’utiliser l’option DLM. Vous pourrez
aussi passer par Excel, enregistrer votre fichier dans un format XLS, pour ensuite
utiliser le module d’importation.

2.5 Toutes les observations apparaissent


sur une même ligne
Dans les cas simples que nous avons examinés jusqu’ici, chaque ligne du fichier brut
correspondait à une observation. Imaginons maintenant qu‘une ligne corresponde à
plusieurs observations. Pour l’exercice 2.4, vous ne disposez pas encore des outils
permettant d’apporter des réponses pertinentes aux questions posées – ce qui est
important ici, c’est de comprendre pourquoi le programme que vous allez rédiger
pour répondre à la question posée ne fonctionne pas.
Exercice 2.4 : Dans le fichier FLORIDE.TXT, vous disposez des précipitations observées
en Floride depuis plus d’un siècle dans les vingt-deux stations d’observations de cet État.
Malheureusement, nous avons fait une mauvaise manipulation en préparant ce fichier :
les observations sont bien séparées d’un espace mais il n’y a aucun saut de ligne.
Exemple : 80211 1903 -9999 80211 1904 2507 80211 1905 4876 80211 1906 5023
80211 1907 6356 …
Sur cette ligne, 80211 est le numéro de la base ; 1903, l’année d’observation ; –9999 désigne
la valeur manquante ; sinon ce sont les précipitations annuelles que vous observerez.
Créez une table SAS avec ces données (merci de traiter aussi dans le même temps les
valeurs manquantes en remplaçant -9999 par un ‘.’). Il y a 2 299 observations. La
ligne de données que vous avez à traiter comprend un peu moins de 38 000 caractères.
Nous avons vu que, par défaut, lorsque SAS analyse une ligne de données, c’est ce qui
suit l’instruction INPUT et les options qui peuvent apparaître dans l’instruction
INFILE qui déterminent sa façon de lire les données. Parmi les éléments du fonction-
nement par défaut de SAS, nous avons ainsi vu que lorsque SAS a donné à toutes les
variables définies par l’instruction INPUT une modalité, il cesse de lire la ligne de
données et passe à la ligne suivante. Dans le cas de l’exercice 2.4, nous ne voulons pas
que SAS passe à la ligne suivante (qui n’existe pas en fait). Ceci sera fait au moyen de
l’option @@ de l’instruction INPUT. Le programme qui traitera correctement le
fichier FLORIDE.TXT est donc le suivant :

Programme 2.20

DATA floride;
INFILE 'C:\intro_SAS\fichiers\floride.txt' LRECL=38000;
INPUT base annee pluie @@;
IF pluie=-9999 THEN pluie=.;
RUN;

Puisque la longueur d’une ligne de données dépasse 256 caractères, vous devez spéci-
fier un LRECL suffisamment important. Certains d’entre vous ont peut-être tenté
SAS Livre Page 48 Jeudi, 18. septembre 2008 6:03 18

48 ◆ SAS

d’introduire une commande MISSING -9999 pour traiter le problème des valeurs
manquantes codées –9999. Cette commande MISSING n’est pas possible ici puisque
seules des lettres peuvent être utilisées pour marquer une valeur manquante. Pour
corriger les valeurs manquantes1, il vous faudra remplacer les –9999 par valeur
manquante. C’est objet de la quatrième ligne du programme 2.20.

2.6 Les modalités relatives à une même


observation apparaissent sur plusieurs lignes
Vous allez apprendre à transformer plusieurs lignes dans votre fichier brut en une
observation. Si vos données apparaissent à l’écran (CARDS), vous n’aurez générale-
ment pas besoin d’outils de programmation spécifiques. En effet, comme nous
l’avons vu dans la section 1.4., si dans votre ligne INPUT vous spécifiez plus de varia-
bles qu’il n’y a d’informations sur une ligne, et si vous passez par un CARDS, SAS
cherchera à lire les informations sur les lignes suivantes. Maintenant, pour créer une
table SAS à partir d’un fichier extérieur (commande INFILE), il est nécessaire de
mettre en place une programmation spécifique.

2.6.1 Cas simple


Imaginons que nous ayons le fichier suivant à transformer en table SAS :
----+----1----+----2----+----3----+----4----+
la grande vadrouille
16 1966
A 7
le mur de l’atlantique
14 1970
AB 6
Sur la base de ce que vous savez déjà, sans les outils de programmation que nous
allons développer plus loin, vous pourriez écrire le programme 2.21.
Programme 2.21

DATA bourvil;
INPUT film $ 1-22 note annee code $ ordre;
CARDS;
la grande vadrouille
16 1966
A 7
le mur de l’atlantique
14 1970
AB 6
RUN;

Ce programme fonctionne parfaitement. Vous trouverez ces mêmes données dans le


fichier ESSAI.TXT.

1. C’est absolument nécessaire. Imaginez que vous souhaitiez calculer des précipitations moyennes par
année ou par station météorologique. Si vous conservez des –9999, il est bien possible que vous puissiez
démontrer que la pluie part du sol et va vers les nuages.
SAS Livre Page 49 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 49

Un programme adapté au fait que les données ne sont plus à l’écran pourrait être le
suivant :
Programme 2.22

DATA bourvil;
INFILE 'C:\intro_SAS\fichiers\essai.txt' TRUNCOVER;
INPUT film $ 1-22 note annee code $ ordre;
RUN;

Vous êtes obligé de passer par un TRUNCOVER parce que les titres ne font pas tous
22 caractères. Cependant, vous constaterez, au moyen d’un PROC PRINT sur la table
créée, que votre programmation n’a pas fonctionné. Lorsque vous faites référence à
un fichier brut, sans outils de programmation spécifiques, en utilisant l’option
TRUNCOVER, vous aurez toujours autant d’observations que de lignes dans votre
fichier brut. Lorsque les informations relatives à nos observations (films) se retrou-
vent sur plusieurs lignes, vous devrez utiliser les intructions « / » et « #X ». Pour créer
votre table, vous pouvez adopter le programme 2.23.

Programme 2.23

DATA bourvil;
INFILE 'C:\intro_SAS\fichiers\essai.txt' TRUNCOVER;
INPUT film $ 1-22 / note 1-2 annee / code $ 1-3 ordre 6;
RUN;

Le signe / indique à SAS de passer à la ligne suivante après avoir lu la variable FILM
présentée sur les colonnes 1 à 22, puis de passer à la ligne suivante (la troisième) après
avoir lu la variable ANNEE. D’une manière équivalente, on pouvait aussi entrer :
INPUT film $ 1-22 #2 note 1-2 annee #3 code $ 1-3 ordre 6;
La commande # indique à SAS sur quelle ligne il doit se situer pour lire les informa-
tions suivantes qui se trouvent sur les deuxième et troisième lignes. Tout comme pour
la commande @x qui permet de se déplacer à droite et à gauche sur une ligne, la
commande #x permet de revenir en arrière.
INPUT film $ 1-22 #2 note 1-3 annee #3 code $ 1-3 ordre 6
#1 article $ 1-2;
Il est demandé à SAS, une fois saisie la variable ORDRE, de revenir sur la première
ligne pour construire une variable avec les deux premières lettres du titre du film.
Exercice 2.5 : Dans le fichier SGTPEPPER.TXT, vous trouverez la liste des chansons
comprises dans l’album des Beatles, Sgt Pepper’s Lonely Hearts Club Band. Le fichier
est organisé de la manière suivante :
----+----1----+----2----+----3----+----4----+
1 Sgt. Pepper’s Lonely Hearts Club Band
Lennon McCartney 2:02 A
Ordre / titre de la chanson /
Compositeur 1 / compositeur 2 / durée du titre / face
Créez une table SAS à partir de ce fichier. Vous devez utiliser le fichier externe – ne
copiez-collez pas vos données dans l’éditeur.
SAS Livre Page 50 Jeudi, 18. septembre 2008 6:03 18

50 ◆ SAS

2.6.2 Cas moins simple


Dans la section précédente, les observations apparaissaient certes sur plusieurs lignes
mais on pouvait compter sur le fait que chaque observation s’affichait sur un même
nombre de lignes. Les données qui vont être utilisées pour le programme 2.24 diffè-
rent sensiblement par leur organisation.
On n’observe pas la même régularité que dans le cas précédent. Une première ligne
indique le nom de la famille à considérer (clé 1) et les suivantes (autant de lignes que
de membres dans la famille), les clés 2, indiquent le prénom et l’âge des membres de
la famille. Ce type de données pourrait être issu d’un recensement de la population,
par exemple. Nous étudierons les instructions qui permettent de traiter ce genre de
table plus loin. Si c’est votre première lecture de cet ouvrage, vous pourrez revenir
plus tard sur ce programme et ses commentaires.

Programme 2.24

DATA famille; 1. Création d’une table famille.


RETAIN nom; 2. La commande RETAIN indique à SAS qu’il
INPUT cle @;
IF cle=1 THEN INPUT @11 nom $;
doit se rappeler d’une ligne sur l’autre ce
ELSE DO; qu’il a mis dans la variable NOM (voir
INPUT @3 prenom $12. @15 age; section 3.8.1.).
OUTPUT; 3. INPUT : SAS saisit la clé (si 1 -> FAMILLE
END; si 2 -> PRENOM et AGE). Via l’instruction
CARDS; @, vous demandez à SAS d’attendre. Le @
1 famille Dupont
2 Pierre 38 permet ici des traitements conditionnés au
2 Sophie 37 résultat de la commande INPUT.
2 Théodore 6 4. Si CLE=1, alors SAS enregistre une variable
2 Marcelline 5 alphanumérique NOM, à lire à partir de la
1 famille Dubois 11e colonne.
2 Frédéric 42
2 Michelle 37 5. Dans le cas contraire (ELSE), les instructions
2 Marie 11 situées entre les commandes DO (voir
1 famille Durand section 3.6.1) et END (DO s’arrête avec
2 Jean 53 END ;) sont exécutées. SAS va alors saisir
1 famille Dufour PRENOM et AGE, puis il écrira dans la table
2 Hervé 78 l’observation (instruction OUTPUT)
2 Marie 75
;RUN;
composée des modalités prises par NOM
(qu’il a en mémoire), PRENOM et AGE.

Résultat 2.4
Obs nom cle prenom age
1 Dupont 2 Pierre 38
2 Dupont 2 Sophie 37
3 Dupont 2 Théodore 6
4 Dupont 2 Marcelline 5
5 Dubois 2 Frédéric 42
6 Dubois 2 Michelle 37
7 Dubois 2 Marie 11
8 Durand 2 Jean 53
9 Dufour 2 Hervé 78
10 Dufour 2 Marie 75
SAS Livre Page 51 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 51

Exercice2.6 : Le fichier BEATLES.TXT a une structure très proche de celle de


SGTPEPPER.TXT sauf qu’il s’agit ici de traiter non plus un mais quatre albums des
Beatles.
----+----1----+----2----+----3----+----4----+
0 1967 Sgt. Pepper’s Lonely Hearts Club Band
1 Sgt. Pepper’s Lonely Hearts Club Band
Lennon McCartney 2:02 A
La ligne 0 donne l’année de sortie de l’album ainsi que son titre ; les lignes suivantes
(>0) reprennent dans le même ordre et avec la même structure le numéro d’ordre de la
chanson, son titre, le premier compositeur, le deuxième compositeur, la durée (minutes,
secondes) et la face sur le 33 tours original. Vous devez obtenir la table suivante :
duree duree
Obs album annee num titre compo1 compo2 M S face
51 Abbey Road 1969 8 Because Lennon McCartney 2 45 B

2.6.3 Un dernier cas


Imaginons que les données soient organisées de la manière suivante :
----+----1----+----2----+----3----+----4----+----5----+----6----+
0 famille Dupont
4 Pierre 38 Sophie 37 Théodore 6 Marcelline 5
0 famille Dubois
3 Frédéric 42 Michelle 37 Marie 11
0 famille Durand
1 Jean 53
0 famille Dufour
2 Hervé 78 Marie 75
Ici, les deux premières lignes doivent être combinées pour donner dans votre table
quatre observations (une par membre de la famille), les lignes 3 et 4 produiront trois
informations, etc. Dans ce cas, c’est l’observation de la structure de votre fichier brut
qui vous aidera à trouver la solution. On remarque déjà que la clé est ici égale au
nombre de membres de la famille et que les données sont présentées en colonnes – le
premier prénom débute en colonne 3, le deuxième en colonne 18, le troisième en
colonne 33 et le quatrième en colonne 48. Le programme 2.25 prend en compte ces
diverses informations pour construire correctement la table souhaitée.

Programme 2.25

DATA famille;
RETAIN nom;
INPUT cle @;
IF cle=0 THEN INPUT @11 nom $;
ELSE DO I=1 TO cle;
INPUT @(3+15*(i-1)) prenom $12. age @@;
OUTPUT;
END;
CARDS;
0 famille Dupont
4 Pierre 38 Sophie 37 Théodore 6 Marcelline 5
0 famille Dubois
3 Frédéric 42 Michelle 37 Marie 11
0 famille Durand
SAS Livre Page 52 Jeudi, 18. septembre 2008 6:03 18

52 ◆ SAS

1 Jean 53
0 famille Dufour
2 Hervé 78 Marie 75
;RUN;

Encore une fois, le programme présenté ci-dessus fait appel à des outils de program-
mation que nous n’avons pas encore vus. La principale différence réside dans la
boucle DO (voir section 3.6.2.) qui va « tourner » autant de fois que la famille a de
membres (information donnée par CLE). Lorsque I=1 (premier tour de boucle),
l’information PRENOM est à lire en colonne 3 = 3 + 15 * (1 – 1). La variable AGE est
à lire ensuite. @@ indique à SAS de ne pas passer à la ligne de données suivante. Les
deux variables ont maintenant leur modalité, la commande OUTPUT indique à SAS
d’écrire dans la table les valeurs des variables CLE, NOM, I, PRENOM et AGE. On
examine maintenant cette même sous-partie du programme pour I=2. La variable
PRENOM est à lire en 18e colonne (3 + 15 * (2 – 1)), puis AGE vient ensuite…
La présente configuration des données n’est pas commune. Ayez cependant à l’esprit
que vous pourrez toujours construire une table SAS fidèle à vos données, quelle que
soit l’organisation des données, si vous avez compris la logique de cette organisation.
Une dernière remarque enfin : vous noterez que la table construite ici a plus d’obser-
vations que de lignes dans le fichier brut de départ. C’est une conséquence de la
présence dans le programme de la boucle DO et surtout de l’instruction OUTPUT.

2.7 Retour sur la gestion des valeurs manquantes


Dans la section 1.5., nous avons vu que les valeurs manquantes des variables numéri-
ques devaient absolument être saisies au moyen soit d’un « . », soit d’un caractère que
vous pourrez ensuite déclarer comme significatif d’une valeur manquante. Ce n’est
pas tout à fait exact. Prenons le fichier MISSING1.TXT :
a;b;c;1;2;3
d;e;f;4;5;6
g;h;i;7;8;9
k;l;m;10;11;12
Pour le faire comprendre à SAS, vous allez exécuter le programme 2.26.
Programme 2.26

DATA test;
INFILE 'C:\intro_SAS\fichiers\missing1.txt' DLM=';';
INPUT x1 $ x2 $ x3 $ n1 n2 n3;
RUN;

Et cela fonctionnera parfaitement. Imaginons maintenant que vous ayez des valeurs
manquantes dans ce même fichier (MISSING2.TXT) mais que celles-ci ne soient pas
saisies par des « . »
a;b;c;1;2;3
;e;f;4;5;6
g;;i;7;8;9
k;l;;10;;12
SAS Livre Page 53 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 53

Si vous demandez une exécution du même programme et si vous réalisez ensuite un


PROC PRINT, vous constaterez que cela ne fonctionne absolument pas. Vous obtenez
en effet :
Résultat 2.5
Obs x1 x2 x3 n1 n2 n3
1 a b c 1 2 3
2 e f 4 5 6 .

Pourquoi ? Simplement parce que vos valeurs manquantes ne sont saisies par rien.
SAS propose une solution via l’instruction DSD associée à l’instruction DLM.
Programme 2.27

DATA test;
INFILE 'C:\intro_SAS\fichiers\missing2.txt' DLM=';' DSD;
INPUT x1 $ x2 $ x3 $ n1 n2 n3;
RUN;

Comme nous l’avons déjà vu, vous devez employer l’instruction DSD si vos données
sont séparées par des virgules. Associée à l’instruction DLM, elle indique que si deux
séparateurs de modalités se suivent, il y a une valeur manquante.
Si vous exécutez maintenant le programme ci-dessus et si vous demandez un PROC
PRINT sur votre table, vous aurez bien quelque chose de correct. Vous avez égale-
ment la possibilité de créer une table au moyen des données reproduites dans le
programme 2.28.

Programme 2.28

DATA test;
INFILE CARDS DLM=' ' DSD;
INPUT x1 x2 x3;
CARDS;
1 2 3
4 6
7 8 9
;RUN;

Puisque deux séparateurs de modalités définies par DLM se suivent, la variable X2


pour la seconde observation sera déclarée manquante. En revanche, ce type de
programmation peut devenir dangereux si vous l’appliquez aux données brutes
reproduites dans le programme 2.29.
Programme 2.29

DATA test;
INFILE CARDS DLM=' ' DSD;
INPUT x1 x2 x3;
CARDS;
1 2 3
4 6
7 8 9
;RUN;
SAS Livre Page 54 Jeudi, 18. septembre 2008 6:03 18

54 ◆ SAS

Vous noterez ici qu’entre 4 et 6, il y a trois espaces : SAS va exécuter le pro-


gramme comme vous le lui avez ordonné et déclarera X3 comme valeur manquante
pour le second individu. Maintenant, dans le cas présent, vous n’aurez aucune
difficulté à gérer ce problème de valeur manquante non marqué par un signe
quelconque puisque vos données sont présentées en colonnes.

2.8 Les INFORMAT : format des valeurs entrantes


Le signe $ que vous devez ajouter à la suite du nom d’une variable alphanumérique
est un INFORMAT. Il a pour objet, comme tous les INFORMAT, de dire à SAS
comment traiter une information pour la transformer en une modalité lisible par
SAS. Il existe beaucoup d’INFORMAT et l’objet de cette section est d’évoquer les plus
courants1.

2.8.1 Les INFORMAT des variables alphanumériques


Nous travaillons ici à nouveau avec les données suivantes2 :
la grande vadrouille Louis de Funès 16 1966 A V 7
le mur de l’atlantique Jean Poiret 14 1970 AB 6
le cercle rouge Alain Delon 20 1970 Z A 8
le corniaud Louis de Funès 14 1965 SD 4
le chanteur de mexico Luis Mariano 12 1956 A B 5
la traversée de Paris Jean Gabin 19 1958 S 2
Par défaut, les variables alphanumériques dans SAS comprennent 8 caractères : la
prise en compte d’un nombre de caractères plus élevé ne pourra se faire que grâce
à la spécification d’un INFORMAT qui indiquera combien de caractères considérer
pour telle variable alphanumérique. Un INFORMAT de variable alphanumérique se
termine toujours par un « . ».
INPUT film $char22. acteur $char14. note annee code $ 50-52 ordre ;
Cette commande indique à SAS que la variable alphanumérique FILM aura EXAC-
TEMENT 22 caractères et SAS mettra 22 caractères à toutes les observations de film.
Si le titre fait plus de 22 caractères, SAS tronquera les 23e et suivants.
Si vous entrez plutôt 3:
INPUT film $22. acteur $14. note annee code $ 50-52 ordre ;
SAS éliminera les espaces, s’il y en a, en début de modalité. C’est important si, par
exemple, vous avez l’intention de trier votre table en fonction de cette variable alpha-
numérique. Dans les procédures de tri, l’espace a une valeur. Si vous conservez les

1. Voir dans la documentation SAS : SAS PRODUCTS / BASE SAS / SAS LANGUAGE DICTIONNARY
/ DICTIONNARY OF LANGUAGE ELEMENTS / INFORMAT. Sur les 41 INFORMAT sur variables
alphanumériques présentés dans l’aide de SAS 9.1.3, cette section citera moins d’une dizaine
d’INFORMAT. Les INFORMAT binaire colonne et les INFORMAT ISO 8601 ne seront pas évoqués
dans cet ouvrage.
2. Fichier bourvil.txt.
3. Vous observerez souvent dans d’autres programmes SAS des lignes INPUT X $ 20. plutôt que les
lignes X $20. comme ici. Les deux formes sont parfaitement équivalentes.
SAS Livre Page 55 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 55

espaces, vous aurez en premier le titre de film contenant le moins de caractères et à la


fin, celui qui a le plus de caractères. À égalité du nombre de caractères, vous aurez
bien un tri alphabétique.
Une autre différence entre $w. et $CHARw. réside dans le traitement des valeurs
manquantes. $w. considérera le point « . » comme symbole d’une valeur manquante,
pas $CHARw. Avec ce second INFORMAT sur variable alphanumérique, là aussi,
vous forcez la longueur maximale à 22 caractères : si la modalité comprend plus de
22 caractères, SAS coupe.
Sur les variables alphanumériques, il existe donc deux principaux INFORMAT : $W. et
$CHARW. Par l’imposition d’un INFORMAT, vous précisez en fait le nombre de carac-
tères qui doivent être lus dans les données brutes (partie « W » de l’INFORMAT) et utili-
sés pour enregistrer la variable dans la table. Vous indiquez aussi comment SAS doit
interpréter ces données brutes (partie « $ » ou « CHAR » de l’INFORMAT).
Exercice 2.7 : Modifiez la ligne INPUT en introduisant l’INFORMAT adéquat de la
variable Code.
Dans l’exemple qui nous occupe, vous comprenez que, dans la ligne d’INPUT, les options
$ 1-22 et $22. sont parfaitement équivalentes. Vous ne pouvez pas spécifier à la fois un
INFORMAT et indiquer une position absolue – c’est en fait logique puisque la défini-
tion de la variable par sa position absolue et le signe $ définit aussi son INFORMAT.

Exercice 2.8 : Le fichier LEADER_CCCP.TXT est à transformer en table SAS.


Vladimir-Ilych Lenin
Joseph Stalin
Georgy Malenkov
Nikita Khrushchev
Leonid Brezhnev
Yuri Andropov
Konstantin Chernenko
Mikhail Gorbachev
Sans modifier quoi que ce soit dans cette liste, constituez une table SAS de deux
variables (prénom et nom). Ne passez pas trop de temps sur cet exercice, vous ne
disposez pas des outils qui vous permettraient de répondre à la question. Tentez
quand même de le résoudre afin de comprendre pourquoi cela ne fonctionne pas.
De nombreux prénoms et noms de famille prennent plus de 8 caractères. Il conviendrait
donc dans le cas présent de lire pour le prénom, au besoin, jusqu’à 14 caractères, et pour
le nom de famille, au besoin, jusqu’à 10 caractères. Dans leur forme actuelle, les INFOR-
MAT n’ont pas cette capacité : ils lisent exactement le nombre de caractères indiqué.
Pour indiquer à SAS qu’il doit lire un certain nombre de caractères mais que s’il voit un
signe de fin de modalité, il doit cesser son enregistrement, vous devez ajouter « : » devant
l’INFORMAT. Ainsi, la ligne d’INPUT suivante construira bien la table souhaitée :
INPUT prenom :$14. nom :$10. ;
Il n’y a pas besoin d’indiquer ici l’option TRUNCOVER dans l’instruction INFILE.
La fin de ligne est considéré par les INFORMAT de type :$w. comme un signe d’arrêt
de l’enregistrement.
SAS Livre Page 56 Jeudi, 18. septembre 2008 6:03 18

56 ◆ SAS

Le tiret entre Vladimir et Ilych n’a aucune justification dans la grammaire russe, il
était simplement présent afin de vous simplifier la tâche. S’il n’y avait pas ce tiret,
comment constitueriez-vous votre table SAS1 ? Pour résoudre ce problème, vous
pouvez introduire une petite modification dans le fichier tel qu’il apparaît plus haut
en mettant par exemple deux espaces entre le prénom et le nom (voir section 2.4.).
Ensuite, votre ligne INPUT deviendra :
INPUT prenom & $14. nom $10.;

Programme 2.30

DATA acteur;
INPUT acteur $ film $;
CARDS;
Bourvil La traversée de Paris
Jean Gabin La bête humaine
Louis de Funes Pouic Pouic
;RUN;

Le programme 2.30 ne fonctionnera pas quel que soit l’INFORMAT que vous choisi-
rez parce que l’espace apparaît au sein des modalités et qu’il est en même temps le
séparateur de modalités. Il faut donc que votre fichier brut soit modifié et que le sépa-
rateur de modalités diffère de l’espace. Dans le fichier ACTEUR1.TXT un séparateur
égal à # a été introduit. Dans le fichier ACTEUR.TXT, la tabulation est utilisée.
Voici le programme qui traite le fichier ACTEUR1.TXT :

Programme 2.31

DATA acteur1;
INFILE 'C:\intro_SAS\fichiers\acteur1.txt' DLM='#';
INPUT acteur :$20. film :$30.;
;RUN;

Pour traiter maintenant le fichier ACTEUR2.TXT, vous vous dites qu’il suffit
d’indiquer EXPANDTABS dans la ligne INFILE à la place de DLM=. Mais cela ne
fonctionne pas.
Programme 2.32

DATA acteur;
INFILE 'C:\intro_SAS\fichiers\acteur2.txt' EXPANDTABS;
INPUT acteur :$20. film :$30.;
RUN;

Dans le cas présent, SAS arrête la lecture des variables au premier espace qu’il rencontre
alors que vous lui avez indiqué que le séparateur était la tabulation. Vous pouvez alors
ouvrir votre fichier de données au moyen d’un éditeur quelconque (par exemple, Word)
et commander un remplacement des tabulations (^t sous Word) par une séparateur
spécifique comme # pour ensuite relancer un programme analogue au programme 2.322.

1. Dans ce cas, les variables ne sont pas présentées en colonnes mais il existe des espaces au sein des
modalités des variables alphanumériques.
2. Mais si vos modalités sont séparées par des tabulations, vous ouvrirez sans problème votre fichier dans
Excel, pourrez l’enregistrer en format Excel pour ensuite l’importer via le module d’importation de SAS.
SAS Livre Page 57 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 57

D’autres INFORMAT sur variables alphanumériques sont disponibles. Pour une liste
complète, consultez l’aide SAS1. Le tableau 2.1 vous présente quelques INFORMAT.

Tableau 2.1 • INFORMAT des variables alphanumériques

Donnée brute INFORMAT appliqué Modalité dans SAS


"bourvil" $quote9. bourvil
‘fernandel’ $quote11. fernandel
SAS 9’2" $quote9. SAS 9’2
Bourvil $upcase3. BOU
Bourvil $upcase7. BOURVIL
01010010 $binary. R
01101110 $binary. n

2.8.2 Les INFORMAT des variables numériques


Vous n’avez pas besoin de spécifier un INFORMAT si la modalité brute que vous avez
à transformer en une modalité de variable SAS est de la forme :
23 23.2 -23 00023 2.3E1 2.3E01 230E-1
Les données numériques ont parfois des formes qui ne conviennent pas à SAS. Nous
avons ainsi vu que le séparateur décimal interne à SAS était le « . ». Si l’on essaie
d’entrer des données avec des virgules, SAS interprète ce type de données comme un
caractère et crée des valeurs manquantes dans la table. Un INFORMAT permet de
gérer ce type de difficulté.
Les choses sont cependant simplifiées par rapport aux INFORMAT sur variables
alphanumériques parce que le statut du W n’est pas le même si vous utilisez un
INFORMAT numérique ou si vous utilisez un INFORMAT alphanumérique. Avec
un INFORMAT sur variable alphanumérique, le W indique deux choses :
• le nombre de caractères à lire dans le fichier brut, information nécessaire si votre
modalité fait plus de 8 caractères ou si un espace intervient dans la modalité ;
• le nombre d’octets à utiliser pour enregistrer la modalité dans la table SAS et donc le
nombre maximal de caractères qui pourront être enregistrés pour cette variable2.
En ce qui concerne les variables numériques, le W ne spécifie pas le nombre d’octets
à utiliser pour enregistrer la modalité dans la table SAS3. Il ne sert qu’à indiquer le
nombre de caractères à lire dans le fichier brut. Ensuite, contrairement aux variables
alphanumériques, SAS ne limite pas sa lecture à 8 caractères4. Par conséquent, sauf
dans des cas particuliers, vous n’aurez pas besoin de spécifier le W des INFORMAT
numériques et la plupart de vos INFORMAT seront de la forme :INFORMAT.

1. Onglet Sommaire : SAS products / Dictionnary of Language Elements / Informats.


2. En effet, pour enregistrer un caractère, il faut un octet.
3. Vous pouvez tout de même fixer le nombre d’octets utilisés pour stocker une modalité numérique
mais cela n’est pas possible avec l’instruction INPUT – les données numériques sont systématiquement
codées sur 8 octets.
4. Dans une étape DATA incluant un CARDS, les chiffres composés au maximum de 308 caractères sont
acceptés par SAS.
SAS Livre Page 58 Jeudi, 18. septembre 2008 6:03 18

58 ◆ SAS

Dans quels cas aurez-vous besoin de spécifier le W ? Nous développerons la


réponse à cette question dans la section 2.8.2.b. mais retenez pour l’instant que vous
aurez à préciser le W dans essentiellement deux cas (que vous rencontrerez rarement) :
• Si le séparateur de modalités est l’espace et qu’il apparaisse des espaces au sein de
votre modalité brute1.
Exemple : 1 000, 1er janvier 2008
• S’il n’y a pas de séparateur de modalités et que votre donnée numérique présente
toujours le même nombre de caractères2.
Exemple : 1000abc
0043def
pour des modalités de 1000 et de 43 pour la variable numérique.

a. Quelques INFORMAT sur variables numériques


Les nouvelles versions de SAS sont toujours l’occasion d’introduire de nouveaux
INFORMAT. Pour connaître la liste complète des INFORMAT à disposition pour votre
version de SAS, consultez l’aide SAS3. Nous ne présenterons ici que les INFORMAT les
plus courants avec la notation utilisée par l’aide SAS, à savoir INFORMATw.d4. Vous
utiliserez le plus souvent ces INFORMAT sous leur forme :INFORMAT. Généralement,
un INFORMATw.d demande la lecture d’exactement W caractères et la multiplication
par 10-D de la donnée lue si la donnée est entière. Attention, si la donnée est décimale, la
multiplication par 10-D ne sera pas effectuée.
NUMXw.d
Cet INFORMAT permet de lire les données avec le séparateur décimal (virgule).
:NUMX. va transformer 896,48 (donnée brute) en 896.48 (donnée SAS).
Il est également possible de demander une multiplication par un 10-d mais étant
donné que les données ont des séparateurs décimaux, elle ne s’appliquera pas.
Exercice 2.9 : Sur la base du fichier MARDI.TXT, créez une table SAS. Ouvrez ce
fichier au moyen d’un éditeur de texte quelconque.

PERCENTw.d
Enlève les points, les blancs, les signes $, les tirets, transforme les parenthèses gauches
en signe – (s’il n’y a pas de signe – entre les parenthèses).

1. Ce cas est très improbable. En effet, pour que vous puissiez construire une table qui comprendrait
plusieurs variables, si l’espace intervient à la fois au sein de la modalité et comme séparateur de moda-
lités, il faudrait que votre variable numérique présente toujours le même nombre de caractères ou que
vos données soient présentées en colonnes.
2. Ce cas aurait pu être rencontré dans les années 60-70 où il était important d’économiser de
l’espace de stockage. Pour ce faire, les données brutes étaient systématiquement en colonnes, sans
modalité de séparation et sans séparateur décimal. Pour transformer ces modalités brutes, il convenait
alors d’employer un INFORMAT w.d demandant à lire w caractères, puis à multiplier la donnée par
10-d. Cet INFORMAT existe toujours.
3. Voir dans la documentation SAS, onglet Sommaire : SAS PRODUCTS / BASE SAS / SAS LANGUAGE
DICTIONNARY / DICTIONNARY OF LANGUAGE ELEMENTS / INFORMAT. Sur les 46 INFORMAT
sur variables numériques présentés dans l’aide de SAS 9.1.3, cette section ne cite qu’une vingtaine
d’INFORMAT. L’aide de SAS 9.2 n’indique que 38 INFORMAT sur variables numériques.
4. Si un INFORMAT ou un FORMAT utilise la possibilité offerte par le d, il n’est jamais suivi d’un point.
Le point que vous observez ici termine la phrase.
SAS Livre Page 59 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 59

Ainsi :

Donnée brute INFORMAT Modalité SAS


1% :PERCENT. 0.01
1.6% :PERCENT. 0.016
(1%) :PERCENT. –0.01
(-1%) :PERCENT. –0.01
1% PERCENT3. 0.01
-1%$ :PERCENT. –0.01
1 :PERCENT. 1
1) :PERCENT. 1

En revanche, si le signe % n’apparaît pas, la donnée n’est pas divisée par 100. Pour la
donnée brute 1 %, vous devrez préciser le nombre de caractères à lire étant donné
qu’un espace apparaît entre le 1 et le signe %.
Exercice 2.10 : Créez deux tables SAS au moyen des fichiers TAUX.TXT et
TAUXV.TXT – le second fichier vous apprendra qu’un INFORMAT pour lequel
le « d » est spécifié peut avoir son utilité.

COMMAw.d
Répond à un problème spécifiquement américain. Lorsque ceux-ci écrivent 1000000
de dollars, cela donne $1,000,000.
:COMMA. va transformer $1,000,000 (donnée brute) en 1000000 (donnée SAS).
COMMAw.d enlève les signes $, les blancs, les pourcentages, les virgules, les tirets, les
parenthèses droites et transforme les parenthèses gauches en signes –. La transfor-
mation par 10-D est aussi possible.
Exercice 2.11 : Appliquez l’INFORMAT COMMAw.d aux données suivantes que
vous aurez, au préalable, replacées dans une seule colonne.
1,000,000 $1,000,000 1 000 000 1-000-000 1 000 000%
(1,000,000) (-1,000.00) €1.000.000

Retirez les modalités brutes présentant des espaces pour vérifier que :COMMA. traite
les autres modalités.

COMMAXw.d
Réalise les mêmes transformations sauf qu’elles s’appliquent aux données du type
1.000.000 (notation à l’européenne de 1000000).
EUROw.d
Retirera les virgules et les signes € (le signe E pour l’euro n’est plus reconnu par SAS
depuis la version 9.1) qui pourraient apparaître « à l’américaine », avant la somme donc.
:EURO. va transformer €1,000,000 (donnée brute) en 1000000 (donnée SAS).
SAS Livre Page 60 Jeudi, 18. septembre 2008 6:03 18

60 ◆ SAS

EUROXw.d
Réalise les mêmes transformations sur les sommes saisies à l’européenne.
:EUROX. va transformer €1.000.000 (donnée brute) en 1000000 (donnée SAS).

b. Préciser ou pas W1
S’il n’y a pas d’espace dans les différentes modalités de vos données brutes, vous
n’avez pas besoin de préciser W.
Programme 2.33

DATA test;
INPUT X1 :comma. X2 :eurox. X3 :euro. X4 :percent. X5 :numx. X6;
CARDS;
$1000 €1000,00 €10,000.00 4% 125,6 125.6
$4 €100000 €2,234 (4%) 0,2 12334323.2
;RUN;

Dans les différentes modalités de vos données brutes, s’il apparaît des espaces mais
que le séparateur de modalités ne soit pas l’espace mais un caractère quelconque,
vous n’avez pas besoin de préciser W.
Programme 2.34

DATA test;
INFILE CARDS DLM='@';
INPUT X1 :comma. X2 :eurox. X3 :euro. X4 :percent. X5 :numx. X6;
CARDS;
$ 1000@€ 1000,00@€10 000.00@4 %@125,[email protected]
$ 4@€ 100 000@€2 234@(4%)@0,[email protected]
;RUN;

Dans les différentes modalités de vos données brutes, s’il apparaît des espaces et que
le séparateur de modalités soit aussi l’espace, vous ne pourrez pas construire une
table SAS si vos données ne sont pas présentées en colonnes.
Programme 2.35

DATA test;
INPUT X1 ??? X2 ??? X3 ??? X4 ??? X5 ??? X6;
CARDS;
$ 1000 € 1000,00 €10 000.00 4 % 125,6 125.6
$ 4 € 100 000 €2 234 (4%) 0,2 12334323.2
;RUN;

Dans les différentes modalités de vos données brutes, s’il apparaît des espaces et que
le séparateur de modalités soit aussi l’espace, pour que vous puissiez construire une

1. Les exemples de cette section expliquent dans quels cas vous devrez préciser le W. Ils sont constitués
d’étapes DATA dans lesquelles les données sont introduites au moyen d’une commande CARDS. Vous
retrouverez sur le site compagnon de cet ouvrage ces programmes adaptés à la construction d’une
table au moyen d’un fichier externe. Les règles énoncées restent bien entendus valables.
SAS Livre Page 61 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 61

table SAS, vos données devront être présentées en colonnes. Vous aurez alors besoin
de préciser les W.
Programme 2.36

DATA test;
INPUT X1 comma6. X2 eurox10. X3 euro11.
X4 percent5. X5 :numx. X6 ;
CARDS;
$ 1000 € 1000,00 €10 000.00 4 % 125,6 125.6
$ 4  € 100 000 €2 234 (4%) 0,2 12334323.2
;RUN;

Attention si vous devez utiliser W à la position du curseur :


----+----1----+----2----+----3----+----4----+----5----+----6-
$ 1000 € 1000,00 €10 000.00 4 % 125,6 125.6
Pour la première variable, nous demandons la lecture de 6 caractères ; le curseur est
donc en position 6. Pour lire la variable suivante, bien que la modalité ne prenne que
9 caractères, nous devons demander la lecture de 10 caractères afin de lire le dernier 0
de « 1000,00 ».
Si vos données sont présentées en colonnes mais qu’il n’apparaît pas d’espace au sein
de vos modalités, vous n’aurez pas besoin de préciser les W.

Programme 2.37

DATA test;
INPUT X1 :comma. X2 :eurox. X3 :euro. X4 :percent. X5 :numx. X6;
CARDS;
$1000 €1000,00 €10000.00 4% 125,6 125.6
$4  €100000 €2234 (4%) 0,2 12334323.2
;RUN;

Enfin, si vous pouvez utiliser les INFORMAT sous leur forme :INFORMAT, il est
parfaitement inutile de préciser le W : celui-ci n’est pas pris en compte.
Programme 2.38

DATA test;
INPUT X1 :comma1. X2 :eurox1. X3 :euro1.
X4 :percent1. X5 :numx1. X6;
CARDS;
$1000 €1000,00 €10000.00 4% 125,6 125.6
$4  €100000 €2234 (4%) 0,2 12334323.2
;RUN;

Pour associer à plusieurs variables le même INFORMAT, vous pouvez passer par une
commande INFORMAT. Dans la commande INPUT, vous n’aurez alors plus besoin
de préciser les INFORMAT nécessaires à la compréhension de la donnée brute :
Programme 2.39

DATA test;
INFORMAT X1 X2 numx.;
SAS Livre Page 62 Jeudi, 18. septembre 2008 6:03 18

62 ◆ SAS

INPUT X1 X2;
CARDS;
1,2 2,3
3,4 4,5
;RUN;

Attention cependant : les INFORMAT qui pourraient apparaître dans la commande


INFORMAT seront traités comme des :INFORMAT. Il est alors parfaitement inutile
de préciser le W dans ce cas sauf dans l’exemple proposé par le programme 2.40.
Programme 2.40

DATA test;
INFORMAT X1 X2 comma1.2;
INPUT X1 X2;
CARDS;
$1000 $2000
$30000 $40000
;RUN;

Dans le programme 2.40, nous souhaitons que les données brutes soient multipliées
par 10-2 ; ceci est possible en précisant le D. Si vous exécutez ce programme, vous
constaterez que le W n’est pas pris en compte puisque SAS lit bien l’intégralité des
données brutes. Vous pouvez donner n’importe quelle valeur à W entre 1 et 32, le
résultat sera toujours le même. Vous pouvez aussi ne pas préciser de W : COMMA.2.
Il reste aussi possible d’appliquer le même INFORMAT à plusieurs variables au
moyen de la commande INPUT :

Programme 2.41

DATA test;
INPUT (X1 X2) (:comma.2);
CARDS;
$1000 $2000
$30000 $40000
;RUN;

Il nous reste deux cas à préciser : lorsque les modalités sont séparées par des tabula-
tions et lorsqu’elles sont séparées par des virgules. Dans le cas où les modalités sont
séparées par une tabulation, si les modalités ne contiennent pas d’espaces, vous n’avez
pas besoin de préciser W. En revanche, si les modalités contiennent des espaces, vous
ne pourrez pas construire de table SAS directement1 : vous devrez ouvrir votre fichier
brut, au moyen d’Excel par exemple, et importer votre fichier enregistré dans un
format Excel grâce au module d’importation de SAS.
Si votre séparateur de modalités est la virgule, vous avez deux possibilités :
1. Vos modalités ne contiennent pas de virgules, vous n’aurez alors pas besoin de
préciser W.

1. Nous avons en effet vu dans la section 2.4. que si vos modalités sont séparées par des tabulations,
l’espace continue à être considéré comme le séparateur de modalités.
SAS-CH-02 Page 63 Jeudi, 18. septembre 2008 6:38 18

Pour aller plus loin dans la création de tables SAS ◆ 63

2. Vos modalités contiennent des virgules. Par exemple, $1,000,000.00 :


• Si ces modalités ont des longueurs constantes ou si elles sont présentées en
colonnes, vous devrez introduire des W et surtout pas de « : ».
• Dans le cas contraire, il vous sera impossible de créer une table SAS.
Ce dernier cas est réellement problématique. Pour le résoudre, soit vous demandez à
la personne qui a construit ce fichier brut un autre séparateur de modalités, soit vous
modifiez à la main votre fichier brut. Cette tâche risque d’être difficile (et même
impossible) dans le cas suivant :
1,000.24,234,567,23,54,67,123,345
Quatre variables se cachent dans cet enregistrement. La modalité de la dernière variable
peut être 345, 123345, 123.345 ou 67123354.

c. Exercices
Exercice 2.12 : Dans le fichier PABLO, vous trouverez un descriptif du catalogue des
disques PABLO (extrait) – label de jazz des années 70, créé par Norman Granz,
créateur du label Verve.
Les disques de ce label ont fait l’objet de rééditions (collection OJC) en disques 33 tours
vinyle et étaient distribués par deux sociétés jusqu’à recemment : Fantasy aux États-
Unis et ZYX en Allemagne. Dans ce fichier sont indiqués, dans l’ordre, la référence
PABLO du disque, l’artiste, le titre de l’album, si Fantasy le vend en format vinyle
(fantasy/no), la référence OJC en cas de vente par Fantasy, le prix Fantasy en dollars, si
ZYX le vend en format vinyle (ZYX/no) et le prix ZYX en euros.
Créez une table SAS au moyen des données présentées. Merci de regarder la structure du
fichier PABLO au moyen d’un éditeur de texte quelconque avant de lancer quoi que ce soit.
Exercice 2.13 : Construisez une table SAS en utilisant le fichier PABLO2.TXT
(catalogue complet – la structure du fichier diffère très nettement).
Réservez 48 caractères pour l’artiste (la variable artiste peut prendre jusqu’à
95 caractères : vous allez donc la tronquer), 40 caractères pour le titre de l’album (qui
peut prendre jusqu’à 70 caractères). La structure des observations est la suivante :
----+----1----+----2----+----3----+----4----+
2312131 Count Basie & His Orchestra
Warm Breeze fantasy
OJC-994 $9.98 ZYX €11,49

2.8.3 Des variables numériques particulières :


les dates et heures
Les dates et heures sont des variables numériques. Si une variable reprenant une
date apparaît dans votre fichier brut sous la forme ‘01JAN2008’, vous devez, au
moyen d’un INFORMAT, faire comprendre à SAS, lors de la création d’une table
SAS, qu’il s’agit bien d’une date. Sinon, si vous enregistrez cette variable sous une
forme alphanumérique, vous ne pourrez pas, par exemple, regrouper les observa-
tions relatives à un même mois, trier vos données par ancienneté, ou calculer un
temps entre deux observations consécutives.
SAS Livre Page 64 Jeudi, 18. septembre 2008 6:03 18

64 ◆ SAS

a. Les INFORMAT de date


SAS stocke une date sous la forme d’une variable numérique qui indique le nombre
de jours séparant la date en question du 01/01/1960 : un chiffre négatif indiquera
donc une date antérieure au 1er janvier 1960. SAS gérera n’importe quelle date entre
1582 (année d’imposition du calendrier grégorien) et 20 000.
Plusieurs cas sont possibles :
Premier cas : Vous avez trois variables qui saisissent la date (une variable jours, une
variable mois et une variable année). La fonction MDY vous permet de construire
votre variable :
Programme 2.42

DATA test;
INPUT JJ MM AA;
date=MDY(MM,JJ,AA);
CARDS;
1 1 1960
1 1 1900
10 10 1980
20 12 2003
;RUN;
PROC PRINT; RUN;

Résultat 2.6
Obs JJ MM AA date

1 1 1 1960 0
2 1 1 1900 -21914
3 10 10 1980 7588
4 20 12 2003 16059

La fonction MDY vous permet de recoder un ensemble de variables dans la forme que
SAS comprend comme étant une date (un nombre de jours qui sépare votre date du
01/01/1960). Attention : SAS comprend les dates à l’américaine, c’est-à-dire
mois/jours/année (MDY : Month Day Year).
La date peut être rendue plus parlante par l’application d’un FORMAT. Le FORMAT
définit la forme que devra prendre la variable à l’affichage1.
Programme 2.43

DATA test;
SET test;
FORMAT date yymmdd10.;
RUN;

PROC PRINT;
RUN;

1. Nous traiterons des FORMAT plus en détail dans la section 5.3.


SAS Livre Page 65 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 65

Résultat 2.7
Obs JJ MM AA date
1 1 1 1960 1960-01-01
2 1 1 1900 1900-01-01
3 10 10 1980 1980-10-10
4 20 12 2003 2003-12-20

Deuxième cas : Votre date, dans votre fichier brut, est dans une forme qui peut être
comprise par SAS au moyen d’un INFORMAT.
Imaginons pour cela que votre date, dans le fichier que vous devez transformer en
table SAS, apparaisse sous la forme suivante : 01/12/1960 pour 1er décembre 1960.
Programme 2.44

DATA date3;
INPUT date :ddmmyy.;
CARDS;
01/12/1960
02/12/1960
03/12/1960
;RUN;

Assurez-vous de spécifier le bon INFORMAT : ici, les modalités sont bien 1 décembre
1960, 2 décembre 1960 et 3 décembre 1960. Dans le meilleur des cas, si vous vous
trompez d’INFORMAT, SAS ne va pas comprendre et rejettera votre programme. S’il
l’exécute malgré tout, vous risquez de rencontrer quelques problèmes. Exemple
d’erreur d’INFORMAT :
Programme 2.45

DATA date3;
INPUT date :mmddyy.;
CARDS;
01/12/1960
02/12/1960
03/12/1960
;RUN;

Avec cet INFORMAT, SAS comprend vos dates à l’américaine et les codifiera en
interne comme étant les 12 janvier 1960, 12 février 1960, 12 mars 1960.
Si vous devez et pouvez spécifier le W, les INFORMAT incluant les W peuvent ne pas
comprendre des dates écrites dans une forme voisine. DDMMYY10. peut ainsi trans-
former 1/1/1960, 01/01/1960, 01-01-1960, 01011960, 01/01/60, 010160 ou 01 01 1960
en une date SAS. DDMMYY6. ne comprendra pas 01/01/1960. En revanche, si vous
pouvez ne pas préciser le W, l’INFORMAT :DDMMYY. comprendra toutes les formes
possibles dans lesquelles il n’y a pas d’espace.
Programme 2.46

DATA test_d;
INPUT X :DDMMYY. @@;
CARDS;
01102007 011007 01-10-2007 01-10-07 01/10/2007 01/10/07 01.10.2007
01.10.07 01:10:2007 01:10:07 1102007 11007 1-10-2007 1-10-07
1/10/2007 1/10/07 1.10.2007 1.10.07 1:10:2007 1:10:07
;RUN;
SAS Livre Page 66 Jeudi, 18. septembre 2008 6:03 18

66 ◆ SAS

Tableau 2.2 • Liste des INFORMAT les plus courants sur dates (1er octobre 2007)

Dates dans votre fichier brut INFORMAT spécifique Forme générale


1OCT07 DATE7. :DATE.
1OCT07 DATE.
01OCT07 DATE7.
01OCT2007 DATE9.
01-OCT-07 DATE9.
011007 DDMMYY6. :DDMMYY.
01 10 07 DDMMYY8.
01/10/07 DDMMYY8.
01/10/2007 DDMMYY10.
07274 JULIAN. :JULIAN.
2007274 JULIAN7.
100107 MMDDYY. :MMDDYY.
100107 MMDDYY6.
10/01/07 MMDDYY8.
10/01/2007 MMDDYY10.
Oct07 MONYY. :MONYY.
Oct2007 MONYY7.
071001 YYMMDD6. :YYMMDD.
071001 YYMMDD.
07-10-01 YYMMDD8.
07 10 01 YYMMDD8.
2007-10-01 YYMMDD10.
07Q4 YYQ. :YYQ.
2007Q4 YYQ6.

Attention : ce tableau est loin d’être complet. Consultez l’aide SAS pour connaître les
INFORMAT de date disponibles pour votre version de SAS.
Il est aussi possible de faire entrer des dates saisies en français ou dans d’autres
langues. Les langues1 comprises par SAS sont :
Danish DAN Dutch NLD Finnish FIN
French FRA German DEU Italian ITA
Norwegian NOR Portuguese PTG Spanish ESP
Swedish SVE Swiss_French FRS Swiss_German DES

Vous utiliserez pour cela les INFORMAT suivants : EURDFDE. (version internatio-
nale de DATE.) et EURDFMY. (version internationale de MONYY.). On peut utiliser

1. Les langues indiquées ici sont celles livrées avec SAS 9.1. De nouvelles langues ont été introduites avec
SAS 9.2 (voir section 5.3.4.).
SAS Livre Page 67 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 67

ces INFORMAT dans la forme internationale en spécifiant une option de langue – on


peut aussi simplement modifier le préfixe. Ainsi :1

Programme 2.472

DATA date4; OPTIONS DFLANG=french;


INPUT date fradfde.; DATA date4;
CARDS; INPUT date eurdfde.;
01JAN60 CARDS;
01FEV60 01JAN60
01MAR60 01FEV60
01AVR60 01MAR60
01MAI60 01AVR60
01JUN60 01MAI60
01JUL60 01JUN60
01JUL60
01AOU60
01AOU60
01SEP60
01SEP60
01OCT60 01OCT60
01NOV60 01NOV60
01DEC60 01DEC60
;RUN; ;RUN;

Troisième cas : votre date est saisie de manière que SAS ne la comprendra pas même
en utilisant un de ses INFORMAT. Vous pourrez alors procéder de deux manières :
• Soit vous devrez recoder les jours, mois et années (trois variables distinctes) pour
ensuite utiliser la fonction MDY. Exemple : 1er juillet 2002.
• Soit vous devrez créer votre propre INFORMAT (voir section 2.8.4.).

b. L’option YEARCUTOFF
Soit la date suivante qui apparaît dans un fichier brut : 01/01/07. Quelle est exactement
la date qui se cache derrière ce 01/01/07 : le 1er janvier 2007, 1907, 1807… ?
Par défaut, la date sera comprise (et recodée) comme étant le 1er janvier 2007. Dans le
cas où 07 signifie en fait 1907, vous devez spécifier une nouvelle valeur pour le YEAR-
CUTOFF, option qui définit votre environnement.
OPTIONS YEARCUTOFF = yyyy;
Par défaut, le YEARCUTOFF est égal à 1920 : pour SAS, la date 01/01/10 correspond
forcément au 1er janvier 2010, la date 01/01/19 à 01/01/2019, mais il traduit le
01/01/20 en 01/01/1920. Si vous souhaitez que le 01/01/20 soit considéré par SAS
comme le 01/01/2020, vous devez modifier le YEARCUTOFF en lui donnant une
valeur supérieure à 1920. Cette option est inutile si vous entrez vos dates sous la
forme 01/01/1789.
Exercice 2.14 : Quel YEARCUTOFF faut-il spécifier pour que 14/07/89 soit traité
par SAS comme étant le 14 juillet 1789 ?

1. JUI n’est jamais une abréviation correcte – employez JUN pour juin et JUL pour juillet.
SAS Livre Page 68 Jeudi, 18. septembre 2008 6:03 18

68 ◆ SAS

c. Les INFORMAT de temps


Le principe des variables d’heure est identique à celui des variables de date. Les
mesures du temps stockées par SAS correspondent au nombre de secondes
qui séparent minuit de l’heure considérée. Ainsi, 23:59:59.9, soit un dixième de
seconde avant minuit, sera enregistré par SAS sous la forme 86399.9
(0.9 + 59 + 59 * 60 + 23 * 60 * 60) – une mesure de l’heure est toujours positive.
Il existe deux INFORMAT de temps :
TIME.
qui saura gérer 1:00:00 et 13:00:00.
DATETIME.
qui saura gérer 17MAR00:00:00:00.
DATETIME. est un INFORMAT de temps particulier puisqu’il utilise non pas un
nombre de secondes entre minuit et l’heure considérée mais un nombre de secondes
entre le 1er janvier 1960 et l’heure considérée du jour considéré.
Dans votre fichier de départ, si votre heure apparaît non pas sous la forme 12:00:00 mais
sous la forme de trois variables (ou quatre si vous disposez des dixièmes, voire des centiè-
mes de seconde), il ne vous restera plus qu’à calculer le nombre de secondes entre votre
heure et minuit. Pour plus de détails sur les dates et heures, reportez-vous à l’aide SAS :
(SAS 9.1.3) : support.sas.com/onlinedoc/913/getDoc/fr/lrcon.hlp/a002200738.htm
(SAS 9.2) : support.sas.com/documentation/cdl/en/lrcon/59522/HTML/default/
a002200738.htm
Exercice 2.15 : Reprenez ce que vous avez fait sur les fichiers SGTPEPPER.TXT et
BEATLES.TXT. Nous avions lors de l’exercice scindé l’information durée du morceau
en deux : durée en minutes et durée en secondes. Reprenez votre programmation en y
appliquant l’INFORMAT correct (s’il existe).

2.8.4 Créons notre propre INFORMAT1 !


Pour plus de renseignements sur le sujet de cette section, vous pouvez consulter les
documents suivants :
www2.sas.com/proceedings/sugi27/p101-27.pdf
www.nesug.info/Proceedings/nesug97/begtut/levine.pdf
Vous observerez très certainement un jour des données qui nécessitent un INFOR-
MAT mais pour lesquelles l’INFORMAT désiré n’existe pas. SAS vous offre la possibi-
lité de créer vous-même un INFORMAT. Prenons un exemple. Votre entreprise a
effectué une enquête, sans vous consulter, et a saisi les réponses aux questions qu’elle
a posées de la manière suivante : oui/non/ne sait pas. De plus, elle a sous-traité la
saisie des réponses aux questionnaires papier à une entreprise qui a bâclé le travail :
les réponses contenues dans votre fichier brut sont de la forme oui/OUI/Oui ;
non/NON/Non ; ne sait pas/Ne Sait Pas/NE SAIT PAS. En revanche, votre responsable

1. Attention : cette section fait appel à des notions qui n’ont pas été évoquées jusqu’à maintenant (mais
qui seront vues par la suite). Si c’est votre première lecture de cet ouvrage, vous pouvez passer cette
section et y revenir par la suite. Nous n’évoquons pas dans cette section la sauvegarde pour utilisation
ultérieure des INFORMAT. Ce point sera plus particulièrement traité dans la section 5.3.6.b.
SAS Livre Page 69 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 69

vous indique qu’ils avaient prévu qu’un problème pouvait se poser : ils ont fait mettre
deux espaces entre chaque modalité dans le fichier brut. Vous avez ici le choix entre
deux procédures. La procédure simple et une procédure plus compliquée mais qui
vous permettra de vous sortir de cas beaucoup plus ardus que celui exposé ici.

a. Cas simples
Un cas est simple lorsque vous n’avez que quelques modalités possibles pour une
variable. Ainsi, dans le cas de l’exemple présenté ici, nous avons neuf modalités de
réponse possibles que nous allons transformer en trois valeurs (1, 2 et 3). Dans le cas
simple, vous pouvez passer directement par PROC FORMAT.
Programme 2.48

PROC FORMAT;
INVALUE enq
'OUI','Oui','oui' = 1
'NON','Non','non' = 2
'NE SAIT PAS', 'ne sait pas', 'Ne Sait Pas' = 3;
RUN;

Le programme présenté ici construit un INFORMAT numérique (puisque les moda-


lités prises par la variable réponse seront par la suite 1, 2 et 3). On pourrait construire
un INFORMAT alphanumérique de la même manière :
Programme 2.49

PROC FORMAT;
INVALUE $enq
'OUI','Oui','oui' = 'O'
'NON','Non','non' = 'N'
'NE SAIT PAS', 'ne sait pas', 'Ne Sait Pas' = 'NSP';
RUN;

Les remarques qui suivent sont valables que vous créiez un INFORMAT ou bien un
FORMAT1 :
• Le nom de l’INFORMAT (FORMAT) ne doit pas prendre plus de 7 caractères,
signe dollar compris, si vous avez une version 8, ou plus de 31 caractères si vous
avez une version 9.
• L’INFORMAT est alphanumérique si les LABEL sont précisés entre quotes (cas du
programme 2.49).
• Dans ce cas, le nom de votre INFORMAT (FORMAT) doit commencer par le
signe $.
• Vous ne pouvez pas prendre pour nom celui d’un INFORMAT (FORMAT) existant.
• Votre INFORMAT/FORMAT ne peut se terminer par un chiffre.
Dans le cas des INFORMAT/FORMAT alphanumériques, les LABEL que vous allez
associer à certaines valeurs peuvent prendre jusqu’à 32 767 caractères depuis SAS 9.
Pour spécifier les valeurs à associer à un LABEL, vous pouvez les saisir comme :
• Une valeur unique : 4 ou ‘A’ ou ‘OUI’.

1. Voir la section 5.3.


SAS Livre Page 70 Jeudi, 18. septembre 2008 6:03 18

70 ◆ SAS

• Une liste de valeurs de même type séparées par des virgules : 4, 5, 12, 23 ou ‘A’, ‘B’,
‘Z’, ‘OUI’.
• Un intervalle de valeurs alphanumériques. Ainsi, pour toutes lettres comprises
entre M et Z : ‘M’-’Z’.
• Un intervalle de valeurs numériques. Ainsi, pour toutes valeurs numériques
comprises entre 1 et 50 : 1-50.
Pour spécifier des intervalles numériques, vous pouvez indiquer :
• low-13 : pour inférieur ou égal à 13.
• low-<13 : pour strictement inférieur à 13.
• 25-high : pour supérieur ou égal à 25.
• 25<-high : pour strictement supérieur à 25.
• Si vous spécifiez mal vos intervalles, si elles se chevauchent comme dans 14-25 et
25-high, le second intervalle sera traité comme l’intervalle « strictement supé-
rieur à 25 ».
• La valeur OTHER est possible pour associer un LABEL à toutes valeurs non évo-
quées par les intervalles. OTHER doit cependant intervenir en dernier.
Que se passe-t-il si vous oubliez une possibilité de réponse à associer à une certaine
modalité (par exemple, si la réponse non a été saisie NoN pour un individu).
Si l’INFORMAT que vous avez crée est un alphanumérique, la réponse ‘NoN’ est
reprise telle quelle dans votre table final – cela va vous permettre de reprendre la
définition de votre INFORMAT et de la compléter des modalités que vous avez
oubliées.
Si votre INFORMAT est numérique, dans le cas présent, la modalité associée dans la
table sera valeur manquante ce qui est ici beaucoup plus problématique. Il convient,
lorsque vous créez votre table en utilisant un INFORMAT que vous avez construit, de
lire votre fenêtre JOURNAL. Si SAS rencontre des modalités non évoquées lors de la
construction de l’INFORMAT, il peut vous l’indiquer de la manière suivante :
NOTE: Données incorrectes pour rep en ligne 521 1-11.
RÈGLE : ----+----1----+----2----+----3----+----4----+----5----+----6-
521 oUi
rep=. _ERROR_=1 _N_=3

À partir de cette remarque, vous saurez comment compléter votre PROC FORMAT
des modalités pour l’instant manquantes.

b. Cas plus complexes


Dans certains cas, l’écriture complète de toutes les valeurs brutes possibles et des
valeurs transformées ne sera pas possible. Vous devrez alors utiliser une procédure
plus complexe. Dans un premier temps, nous reprenons le programme présenté dans
la section précédente avec cette procédure plus complexe :
Programme 2.50

DATA infmt;
INPUT start $11. @13 label $;
FMTNAME="enq";
TYPE='J';
CARDS;
SAS Livre Page 71 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 71

oui O
Oui O
OUI O
non N
NON N
Non N
ne sait pas NSP
NE SAIT PAS NSP
Ne Sait Pas NSP
;RUN;
PROC FORMAT CNTLIN=infmt;
RUN;
DATA test;
INPUT nom & $10. (rep1 rep2 rep3)(& $enq.);
CARDS;
jean oui OUI Oui
Pierre non NON Non
paul ne sait pas NE SAIT PAS Ne Sait Pas
;RUN;

Vous créez dans un premier temps une table dans laquelle vous résumez votre
INFORMAT. Il est important que cette table contienne des variables appelées :
• START (dans laquelle vous saisirez vos modalités de réponses brutes) ;
• LABEL (modalités à donner après le passage par l’INFORMAT) ;
• FMTNAME (qui aura pour modalité le nom de votre INFORMAT) ;
• TYPE (=‘J’ J pour INFORMAT caractère).
Les données de la table INFMT sont formatées en colonnes en raison de la modalité
‘ne sait pas’.
L’instruction PROC FORMAT permet la création de l’INFORMAT au moyen des
données contenues dans la table INFMT. Nous utilisons ensuite l’INFORMAT créé
pour traiter les données de la table TEST.
La variable TYPE peut prendre, en cas de création d’INFORMAT, les valeurs J
(INFORMAT caractère), I (INFORMAT numérique). Vous pourrez aussi créer des
FORMAT avec ce type de commande (voir section 5.3.6.) – à ce moment, TYPE
pourra être égal à C si le FORMAT est caractère, ou N s’il est numérique. Vous pouvez
ne pas préciser TYPE si, en cas d’INFORMAT numérique, vous faites précéder le nom
de votre INFORMAT d’un @ ($ si l’INFORMAT est caractère)1.
Bien entendu, vous pouviez aussi créer une table à partir du fichier brut, puis via une
programmation, recréer les différentes valeurs obtenues au moyen de votre INFOR-
MAT2. Cependant, dans certains cas, la construction de la table dans sa forme brute
suivie d’un travail pour obtenir la variable dans le format que vous souhaitez sera
délicate, voire impossible, particulièrement si votre fichier brut contient des formes
de date particulières.

1. Un INFORMAT est caractère lorsqu’il transforme une donnée en une chaîne de caractères ; il est
numérique s’il transforme la donnée brute en donnée numérique – la forme de la donnée brute ne
compte pas. Un FORMAT est numérique lorsqu’il est appliqué à une variable numérique, et caractère
lorsqu’il est appliqué à une variable alphanumérique.
2. Il suffit en effet ici de saisir les modalités brutes, puis de les transformer via la fonction UPCASE (voir
section 3.2.6.) pour ensuite construire une nouvelle variable et attribuer les valeurs 1,2,3 en fonction
de la modalité brute observée.
SAS Livre Page 72 Jeudi, 18. septembre 2008 6:03 18

72 ◆ SAS

Imaginons le scénario suivant : dans votre fichier brut, vos dates ont été saisies sous la
forme 1er janvier 2006, 2 janvier 2006 (des ventes sont indiquées ensuite, deux espa-
ces séparent la date des montants vendus). Il n’existe pas d’INFORMAT qui vous
permette de lire cette donnée. En revanche, cette date est dans un FORMAT de
présentation des dates connu (voir sections 5.3. pour les FORMAT et 5.3.4. pour les
FORMAT spécifiques aux dates). Retenez pour l’instant que le FORMAT est une sorte
de filtre qui vous permet d’afficher, par exemple, une date dans un format lisible (et
non plus comme un nombre de jours séparant votre date du 1er janvier 1960). Votre
programmation devient dans ce cas :
Programme 2.51

DATA infmt2;
RETAIN fmtname "datefra" TYPE "I";
DO LABEL="1jan2004"d TO "1jan2006"d;
start = PUT(LABEL,fradfwdx.);
start = TRIM(LEFT(start));
OUTPUT;
END;
RUN;

PROC FORMAT CNTLIN=infmt2;


RUN;

DATA test;
INPUT date & datefra. vente;
CARDS;
19 décembre 2005 1
20 décembre 2005 2
21 décembre 2005 3
22 décembre 2005 3
1er décembre 2005 5
;RUN;

Dans le programme 2.51, nous créons une table INFMT2 qui va servir de base à
l’INFORMAT. La commande RETAIN1 va permettre de créer, comme dans le
premier cas, les variables FMTNAME et TYPE – cette commande est rendue néces-
saire par la présence d’une boucle DO2. Cette boucle permet la création d’une série
de dates entre le 1er janvier 2004 et le 1er janvier 2006. Le suffixe « d » indique à SAS
que la chaîne de texte entre les guillemets est une date (et c’est pour cela que l’incré-
mentation va pouvoir se faire). La commande PUT3 crée une variable alphanumé-
rique START égale à la date écrite dans le FORMAT FRADFWDX (qui est bien la
forme prise par les dates dans notre fichier brut). La commande TRIM permet
d’effacer les espaces qui pourraient apparaître dans l’enregistrement de la date :
vous forcez le positionnement de la date à gauche et s’il apparaît des espaces, ils
sont effacés.
La commande OUTPUT permet à chaque tour dans la boucle d’écrire les variables
LABEL, START, FMTNAME et TYPE. Ensuite, la procédure PROC FORMAT, comme
dans l’exemple précédant, crée l’INFORMAT spécifique que vous pouvez ensuite

1. Voir section 3.8.1.


2. Voir section 3.6.2.
3. Voir section 3.4.1.
SAS Livre Page 73 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 73

appliquer pour créer votre table. Là encore, une programmation à l’intérieur d’une
étape DATA est possible mais nettement plus délicate que la programmation proposée ici.
Nous avons dans le présent cas profité du fait que, même si l’INFORMAT n’existait
pas, la date était présentée dans un FORMAT connu de SAS. Vous aurez bien souvent
des cas dans lesquels la date ne ressemble à rien de connu. Imaginons par exemple
que dans votre fichier brut, la date se présente sous la forme 2006/AOU/01.
Quels sont les problèmes liés à cette date ?
• Effectivement, aucun INFORMAT ne peut lire cette date.
• Cette date n’est même pas présentée dans un FORMAT de SAS.
• Elle est en français (AOU pour août ; si elle avait été en anglais, on aurait dû lire AUG).
Vous pouvez vous en sortir avec une programmation légèrement modifiée :
Programme 2.52

OPTIONS DFLANG=french;

PROC FORMAT;
PICTURE tempo LOW-HIGH = '%Y/%b/%d' (DATATYPE = DATE);
RUN;

DATA infmt3;
RETAIN FMTNAME "datefraa" TYPE "I";
DO LABEL="01jan2004"d TO "01jan2007"d;
start = PUT(LABEL,tempo11.);
start = TRIM (LEFT (start) );
OUTPUT;
END;
RUN;

PROC FORMAT CNTLIN=infmt3;


RUN;

DATA test;
INPUT date datefraa.;
CARDS;
2006/aou/15
2005/sep/21
2004/jan/5
;RUN;

Nous choisissons le français comme langue par défaut via une commande OPTIONS
puisque les abréviations des mois sont en français. Le premier PROC FORMAT va
créer un INFORMAT temporaire (tempo) via la commande PICTURE : vous indi-
quez ainsi à SAS que toutes les valeurs (low-high) sont organisées de la façon
suivante : %Y : année en 4 chiffres ; %b : mois en trois lettres dans la langue par
défaut ; %d : jour du mois en chiffres (voir plus bas pour d’autres codes possibles).
Année, mois et jour sont séparés par des signes « / » – l’option DATATYPE indique
que nous créons bien un INFORMAT de date.
Ensuite, vous créez une table INFMT3 qui va vous servir à construire votre INFOR-
MAT définitif en utilisant la même procédure que précédemment. La seule difficulté
est de donner à SAS le nombre de caractères qu’il doit utiliser pour écrire la date dans
le FORMAT temporaire – ici, 11 au maximum, 4 pour l’année + 1 (/) + 3 pour le
mois + 1 (/) + 2 pour le jour.
SAS Livre Page 74 Jeudi, 18. septembre 2008 6:03 18

74 ◆ SAS

La commande PICTURE sur des dates, ayant des formes très particulières, va vous
permettre de vous sortir de très nombreuses situations délicates. Différents codes
sont possibles :
• %A : nom du jour en toutes lettres.
• %b : nom du mois en abrégé.
• %B : nom du mois en toutes lettres.
• %d : numéro du jour dans le mois.
• %j : numéro du jour dans l’année.
• %m : mois en décimal.
• %w : jour de la semaine en décimal.
• %y : année en deux chiffres (sans les siècles).
• %Y : année en quatre chiffres (avec les siècles).
Ces commandes fonctionneront aussi sur des dates non anglaises (mais vous devrez
spécifier la langue à utiliser via OPTIONS). Pour plus de détails sur la commande
PICTURE, consultez l’article suivant :
www2.sas.com/proceedings/sugi31/243-31.pdf
Exercice 2.16 : Vous avez dans votre fichier brut la date suivante : « Mercredi
12 décembre 2007 ». Adaptez la programmation pour créer l’INFORMAT qui va
saisir cette date. Imaginez maintenant que cette date est de la forme suivante :« mercredi
12 décembre 2007 ». Adaptez à nouveau votre programmation pour saisir correctement
cette date. Et que devient votre programmation si votre date est au format suivant :
« Mercredi, le 12 décembre 2007 » ?

2.9 Exportons nos tables SAS


Vous devez maîtriser la notion de FORMAT pour comprendre cette section (voir
section 5.3.). Si c’est votre première lecture de cet ouvrage, vous pouvez passer cette
section et y revenir par la suite.
Vous disposez maintenant d’une table SAS que vous souhaitez pouvoir exploiter avec un
autre logiciel. Vous devez donc exporter votre table et lui assigner un format d’enregis-
trement tel qu’il sera aisément lisible par votre second logiciel. La procédure est rela-
tivement aisée et peut se faire grâce à une étape DATA1. Imaginons que vous disposiez
d’une table de n individus pour lesquels 100 variables X1-X100 sont renseignées. Vous
souhaitez créer un fichier qui contiendra uniquement les variables X1-X10.
Programme 2.53

DATA _NULL_;
SET test;
FILE 'C:\intro_SAS\fichiers\extrait.txt';
PUT x1-x10;
RUN;

1. Vous pourrez aussi utiliser la procédure PROC EXPORT – voir l’aide de SAS ou le module d’exportation
des tables (menu FICHIER/Exporter données).
SAS Livre Page 75 Jeudi, 18. septembre 2008 6:03 18

Pour aller plus loin dans la création de tables SAS ◆ 75

Ici, il n’est pas forcément efficace d’écrire une nouvelle table SAS qui présenterait les
caractéristiques du fichier que vous souhaitez créer. L’instruction DATA _NULL_
vous permet de profiter de l’ensemble des outils de programmation de l’étape DATA
sans créer pour autant une nouvelle table SAS. Vous devez indiquer par l’instruction
FILE l’endroit physique sur votre disque dur où doit être placé votre fichier. L’instruction
PUT liste les variables que vous souhaitez voir dans votre fichier.
Comme vous pouvez le constater, la syntaxe présentée ici est très proche de la syntaxe
utilisée lorsque vous transformez un fichier externe en table SAS via les instructions
INFILE et INPUT. Dans le fichier que vous venez de créer, les modalités sont séparées par
des espaces. Cependant, rien ne vous empêche d’utiliser certaines des options vues avec les
commandes INFILE et INPUT pour donner à votre fichier TXT (ou CSV) l’allure
souhaitée permettant une ouverture plus facile avec votre second logiciel. Vous ne pouvez
cependant pas demander à ce que vos modalités soient séparées par des tabulations.
Vous pouvez retirer les FORMAT qui sont associés à certaines de vos variables1 dans
votre table originale au moyen de l’instruction FORMAT _ALL_. Ce ne sera cepen-
dant pas toujours une bonne idée. Ainsi, imaginons que X1 soit une date (et, donc,
un nombre de jours qui sépare la date en question du 01/01/1960). Si vous exportez
cette variable dans un fichier TXT sans FORMAT et qu’ensuite, dans Excel par exem-
ple, vous appliquiez à votre modalité un FORMAT de date, vous aurez quelques
surprises (parce que, pour Excel, une date est un nombre de jours, forcément positif,
qui sépare la date en question du 01/01/1900).
Il peut donc être utile de maintenir le FORMAT existant, voire d’imposer un FORMAT
particulier pour être sûr que votre modalité sera correctement saisie par votre second
logiciel. Par exemple, si votre date est présentée, dans SAS, au moyen d’un FORMAT
MMDDYY10 (affichage des dates à « l’américaine ») que vous conservez ce
FORMAT dans le fichier d’exportation, Excel ne comprendra pas qu’il s’agit là
d’une date et considérera cette dernière comme une chaîne de caractères (et vous
ne pourrez rien en faire). En revanche, si vous imposez un autre FORMAT (comme
le DDMMYY10), votre modalité sera parfaitement interprétée comme une date dans
Excel.
Programme 2.54

DATA _NULL_;
SET test;
FILE 'C:\intro_SAS\fichiers\extrait.txt';
PUT x1 :ddmmyy10. x2-x10;
RUN;

Le « : » qui précède le nom du FORMAT à utiliser est important. Si vous l’omettez,


SAS ne mettra pas de séparateur entre votre date et la variable X2. Ici, le « : » indique
à SAS de prendre 10 caractères pour écrire la date selon ce FORMAT et d’ajouter
ensuite le séparateur par défaut égal à l’espace. Si vos modalités ne contiennent pas
d’espace, vous pourrez ensuite ouvrir votre fichier sous Excel en indiquant que votre
fichier est de type « largeur fixe ». Si des espaces interviennent dans vos modalités,
introduisez un séparateur de modalités particulier – votre type de fichier est alors un
fichier « délimité ». Sur l’ecran suivant du module d’importation des données
d’Excel, vous préciserez le séparateur de modalités que vous avez adopté.

1. Les FORMATS sont présentés en détail dans la section 5.3.


SAS Livre Page 76 Jeudi, 18. septembre 2008 6:03 18

76 ◆ SAS

La modification de FORMAT, voire une imposition d’un nouveau FORMAT, est obli-
gatoire, si la table contient des données décimales, le séparateur décimal dans SAS
étant le point et dans Excel, la virgule. Elle sera aussi obligatoire si vos variables mesurent
des montants dans une quelconque monnaie ($1,000,000.00).
Exercice 2.17 : Parmi les fichiers d’accompagnement de cet ouvrage, vous trouverez
une table SAS appelée aexporter. Exportez-la de façon qu’Excel la comprenne
parfaitement !
SAS Livre Page 77 Jeudi, 18. septembre 2008 6:03 18

Conclusion des chapitres 1 et 2

La procédure de création d’une table SAS à partir d’un fichier brut extérieur est une
procédure délicate. En effet, il est absolument essentiel que votre table soit bien
l’image exacte du fichier brut dont vous disposez. Une mauvaise spécification de
votre ligne INPUT et un mauvais jeu d’options dans la commande INFILE vous
conduiront immanquablement à créer des tables n’ayant qu’un rapport au mieux
lointain avec votre fichier original. L’objet de cette conclusion est de vous donner
quelques conseils vous permettant de vérifier que votre table est bien à l’image de
votre fichier brut.

Regardez et comprenez votre fichier brut


Il est absolument impossible de créer une table SAS si on ne comprend pas la struc-
ture du fichier brut et l’organisation des données.
Pour examiner votre table, vous pouvez utiliser un traitement de texte ou les
commandes FSLIST et NOTEPAD. La commande FSLIST est à exécuter dans la fenê-
tre COMMANDE (en haut à droite). SAS vous invite alors à ouvrir un fichier –
demandez à pouvoir ouvrir tous types de fichiers et retrouvez sur votre disque dur
votre fichier brut. Vous pouvez alors demander, dans la fenêtre COMMANDE, COLS
pour voir apparaître une réglette ou NUMBER pour voir apparaître des numéros de
lignes. Vous pouvez ainsi avoir l’écran reproduit par le résultat C.1.

Résultat C.1

La réglette vous sera particulièrement utile si vous voulez connaître les nombres
de caractères à réserver aux différentes variables alphanumériques, dans le cas où
vous auriez besoin de le préciser. La commande NOTEPAD permet le même type
de résultat sauf que lorsque vous ordonnez NOTEPAD dans la fenêtre
SAS Livre Page 78 Jeudi, 18. septembre 2008 6:03 18

78 ◆ SAS

COMMANDE, une fenêtre vide apparaît. Pour ouvrir un fichier, cliquez alors du
bouton droit dans la fenêtre, demandez Ouvrir, puis retrouvez votre fichier. Pour
faire apparaître la réglette, demandez NUMBER dans la fenêtre COMMANDE,
puis demandez, dans la fenêtre NOTEPAD, l’insertion de réglette à l’endroit où
vous le souhaitez en tapant COLS, puis ENTER sur les numéros de lignes. Contrai-
rement à FSLIST, NOTEPAD permet la modification des fichiers bruts. L’enregis-
trement de votre fichier modifié avec NOTEPAD est automatique lorsque vous
quittez la fenêtre. Si vous utilisez la fonction rechercher-remplacer, les remplace-
ments ne seront effectifs que lorsque vous quitterez la fenêtre. De plus, seuls les
rechercher-remplacer de caractères sont possibles. Contrairement à des traitements
de texte plus évolués, SAS ne semble pas donner la possibilité de remplacer, par
exemple, une chaîne de caractères par une tabulation.

Résultat C.2

Si votre fichier brut est de taille importante, ne tentez pas immédiatement de créer
votre table sur le fichier complet : travaillez plutôt sur un échantillon d’environ
1 000 à 2 000 individus. Ensuite, écrivez dans votre ligne INPUT la liste des variables
que vous allez créer, puis, une fois cette liste faite, réfléchissez aux INFORMAT que
vous devez appliquer. Donnez ensuite les options nécessaires à INFILE pour que votre
fichier soit bien compris. Vous pourrez alors soumettre votre programme.

Lisez la fenêtre JOURNAL


Les utilisateurs débutants oublient très souvent de consulter la fenêtre JOURNAL. Pour-
tant, c’est dans cette fenêtre que vous lirez les informations qui doivent vous aider à
comprendre si votre programme s’est bien déroulé et si votre table a bien été construite.
Imaginons un programme qui a effectivement créé une table SAS (sans erreur de
syntaxe donc – l’erreur de syntaxe la plus courante est l’absence de point-virgule).
La première chose à faire est de lire les longueurs d’enregistrement maximale et mini-
male. La longueur maximale doit être strictement inférieure à 256 caractères. Si cela
n’est pas le cas, vous devez spécifier une longueur d’enregistrement LRECL différente
de la valeur par défaut. Augmentez progressivement votre LRECL et exécutez votre
programme jusqu’à l’observation d’une longueur maximale inférieure à votre LRECL
SAS Livre Page 79 Jeudi, 18. septembre 2008 6:03 18

Conclusion des chapitres 1 et 2 ◆ 79

spécifié. Attention, si votre séparateur de modalités est la tabulation, vous ne pourrez


pas compter sur la longueur maximale de l’enregistrement donnée par la fenêtre
JOURNAL (voir section 2.2.1.).
Regardez ensuite le nombre de lignes lues dans le fichier brut et le nombre d’obser-
vations dans la table SAS qui a été créée. Si votre fichier brut est de structure une
ligne pour une observation, vous devez avoir une égalité entre ces deux nombres.
S’il est de structure trois lignes pour une observation, le nombre d’observations
multiplié par trois doit donner le nombre de lignes du fichier brut. Sauf si vous avez
utilisé une option @@ (voir section 2.5.), votre nombre d’observations est forcé-
ment inférieur ou égal au nombre de lignes de votre fichier brut1. S’il n’y a pas
égalité, plusieurs cas sont possibles et vous devez absolument savoir pourquoi il n’y
a pas correspondance.
• La différence est très faible. Il se peut que dans votre fichier brut, des lignes vides
existent – c’est assez souvent le cas à la fin du fichier brut. Vérifiez à nouveau votre
fichier brut.
• Si ce n’est pas le cas, vous pouvez être certain que, pour créer une observation, il y a eu
combinaison de modalités appartenant à plusieurs lignes – il s’agit d’une erreur grave.
Ce dernier type d’erreur est généralement dû à de mauvais INFORMAT. La première
chose à faire est d’activer l’option TRUNCOVER d’INFILE pour forcer la correspon-
dance entre les lignes du fichier et le nombre d’observations de la table. Il y a cependant
peu de chance pour que cette simple manœuvre suffise à régler votre problème. Il y a
fort à parier qu’au moins un des INFORMAT que vous avez spécifiés n’est pas le bon.
Vous devrez alors avoir recours à un PROC PRINT (si votre table comprend peu de
variables et peu d’observation) ou à l’EXPLORATEUR. Les variables apparaissent en
colonnes dans l’ordre de leur création. Un résultat étrange indique généralement une
erreur sur un INFORMAT. Les erreurs les plus courantes sont :
Dans le cas INFORMATw
• Vous avez spécifié un nombre de caractères trop important pour lire les modalités
de votre variable. SAS va donc lire des caractères de la modalité suivante.
• Le nombre de caractères que vous avez spécifié n’est pas assez important. SAS
arrête donc sa lecture au milieu de la modalité, puis considère la fin de la modalité
comme modalité de la variable suivante. Si votre variable suivante est numérique,
et si c’est une chaîne de caractères qui arrive pour la lecture de cette variable, vous
aurez alors une valeur manquante.
• Attention à la position de votre curseur ! Avec ce type d’INFORMAT, l’enregistre-
ment cesse au bout du wième caractère et la variable suivante est enregistrée à partir
du w + 1ième caractère (voir section 2.3.4.).
Dans le cas :INFORMAT.
• Si votre INFORMAT est alphanumérique, les modalités peuvent contenir des
espaces (ou des séparateurs de modalités) – vous n’avez donc dans votre variables que
le premier mot de votre modalité, les autres sont envoyés vers les variables suivan-
tes. Si la variable suivante est une variable numérique, la chaîne de caractères ne
sera pas acceptée et vous aurez des valeurs manquantes.

1. Cette affirmation n’est plus juste si, d’une façon générale, vous avez sur une ligne des informations
relatives à plusieurs observations.
SAS Livre Page 80 Jeudi, 18. septembre 2008 6:03 18

80 ◆ SAS

• Attention, si le séparateur de modalités est la tabulation, l’enregistrement cesse


aussi quand SAS rencontre un espace. Ce n’est pas le cas lorsque vous utilisez un
séparateur de modalités défini par DLM (voir section 2.2.3.).
Lorsque vous êtes à peu près sûr de vos INFORMAT, il est possible que vous lisiez
dans votre fenêtre JOURNAL des informations du genre :
NOTE: Données incorrectes pour y en ligne 5 3-3.
RÈGLE : ----+----1----+----2----+----3----+----4----+----5----+----6-
5 4 a 6
x=4 y=. z=6 _ERROR_=1 _N_=2

Le message issu de la fenêtre JOURNAL vous indique dans le cas présent que vous
tentez d’entrer dans une variable définie comme numérique dans la commande
INPUT des données non numériques.
Il peut s’agir une nouvelle fois d’un mauvais INFORMAT. Il se peut aussi que vous
ayez face à vous une modalité qui pour quelques observations, a été mal codée lors
de la saisie et la construction de votre fichier brut (imaginez pour cela un code
postal qui est écrit 75OOO – avec des O comme dans Ornicar plutôt que des
zéros). Si vous ne faites rien, vous allez perdre une information puisque votre
variable sera codée valeur manquante. Une solution consiste à forcer un enregis-
trement en alphanumérique pour ensuite, dans un second temps, reconstruire une
variable numérique à partir de l’alphanumérique et commander des traitements
particuliers dans le cas où la variable numérique est valeur manquante alors que
l’alphanumérique ne l’est pas.
Vous remarquez également la présence d’une règle : celle-ci est à utiliser en conjonc-
tion avec l’information présentée en NOTE. SAS vous indique qu’il rencontre un
problème avec la donnée présentée ligne 5 de votre fenêtre JOURNAL entre les carac-
tères 3 et 3 : la règle permet de voir que le « a » n’est pas accepté pour la variable Y,
définie comme numérique dans la ligne INPUT.
Enfin, _ERROR_ et _N_ sont des variables automatiques dont nous expliquons
l’origine dans la section 3.1.4. Elles vous indiquent que SAS a rencontré une ou
plusieurs erreurs (_ERROR_=1 si le nombre d’erreurs est supérieur à zéro) lors de
l’exécution du programme pour l’observation n˚ 2 (_N_=2).

Examinez votre table


Il est donc important que vous ayez une fenêtre JOURNAL parfaitement propre.
Voici les informations que vous devriez y trouver :
NOTE: L’infile ‘C:\intro_SAS\fichiers\merg1.txt’ est :

Nom de fichier=C:\intro_SAS\fichiers\merg1.txt,
RECFM=V,LRECL=256

NOTE: 10 enregistrements lus dans infile ‘C:\intro_SAS\fichiers\merg1.txt’.


La longueur min. de l’enregistrement était 18.
La longueur max. de l’enregistrement était 20.
NOTE: La table WORK.TEST a 10 observations et 5 variables.
NOTE: L’étape DATA a utilisé (Durée totale du processus) :
temps réel 0.00 secondes
temps processeur 0.00 secondes
SAS Livre Page 81 Jeudi, 18. septembre 2008 6:03 18

Conclusion des chapitres 1 et 2 ◆ 81

Toutefois, une telle fenêtre ne vous garantit pas que votre table sera à l’image exacte
de votre fichier brut. Il convient de procéder à quelques vérifications. A priori, vous
devez connaître pour chaque variable le type de modalités que vous devez rencontrer.
Ordonnez alors :
PROC FREQ;
RUN;
La commande est dangereuse parce qu’elle consiste à demander à SAS de construire
un tableau de fréquences pour chacune des variables. Pour les variables de type iden-
tifiant individuel, vous allez donc avoir autant de lignes dans votre tableau que
d’individus dans votre table. Vous pouvez limiter dans ce cas les variables à examiner
en ne spécifiant que les variables pour lesquelles vous souhaitez un tableau de
fréquences via la programmation suivante :
PROC FREQ;
TABLES x1 x2 x3;
RUN;
Vous devrez alors répondre à deux questions :
• Les modalités observées pour cette variable sont-elles bien celles que vous
attendiez ?
• Est-il normal d’avoir autant de valeurs manquantes ?
Il n’y a pas vraiment de « truc » que nous puissions vous donner1. Avec l’expérience,
vous réussirez rapidement à répondre à ces deux questions.
Les problèmes liés aux valeurs manquantes apparaîtront plus clairement lors des
phases de modification des tables puisque, parmi les messages qui peuvent apparaître
dans votre fenêtre JOURNAL, vous pouvez avoir :
NOTE: Des valeurs manquantes ont été générées à la suite d’une opération sur des
valeurs
manquantes.
Chaque endroit est défini par : (Nombre de fois) dans (Ligne):(Colonne).
100 dans 23:5

Il est très important de comprendre l’origine de vos valeurs manquantes puisque les
nouvelles variables construites sur la base de votre variable de départ auront souvent
des valeurs manquantes si votre variable de départ présente des valeurs manquantes.
En outre, c’est grâce à cet examen que vous constaterez la grande distance entre votre
table actuelle et la table qui vous est nécessaire pour produire vos premiers résultats.
La table issue de l’étape de création est rarement prête à l’analyse : vous devrez la
modifier, construire de nouvelles variables…

1. Il faut malgré tout citer le mode DEBUG qui est à réserver aux cas dans lesquels vous ne comprenez
vraiment pas pourquoi la table créée n’est pas à l’image de votre fichier brut. Pour plus de renseigne-
ments, vous pouvez consulter l’aide SAS, entrée DEBUG option / DATA statement. Attention, ce
mode n’a rien de simple.
SAS Livre Page 82 Jeudi, 18. septembre 2008 6:03 18
SAS Livre Page 83 Jeudi, 18. septembre 2008 6:03 18

3
La modification des tables SAS

Au sommaire de ce chapitre :
3.1. L’exécution par SAS de vos programmes
3.2. Les opérateurs et les fonctions usuelles de construction et de transformation
de variables
3.3. Alléger une table SAS
3.4. La construction de nouvelles variables au sein d’une table SAS.
3.5. La construction sous conditions
3.6. Les boucles DO
3.7. Les boucles sur ARRAY
3.8. Donner une mémoire à SAS
3.9. Les listes de variables
Vous disposez à ce stade d’une table, copie fidèle de vos données brutes stockées
jusqu’à maintenant dans un fichier externe à SAS. Vous allez maintenant devoir
modifier votre table parce que les variables telles que vous les souhaitez n’existent pas
encore. Il est possible, dès la phase de création de la table SAS, de créer de nouvelles
variables à partir des variables listées dans la commande INPUT ou de modifier
celles-ci. Votre programme aura alors la structure suivante :
DATA test;
INPUT x1 x2 ...;
** vos commandes de modification / construction de variables interviennent ensuite;
CARDS;
vos données
;RUN;
Nous vous conseillons, dans un premier temps, de ne pas mélanger les étapes DATA
de création de table avec les étapes DATA de modification de table. Chacune de ces
étapes présente des difficultés qui lui sont propres et les questions auxquelles vous
devrez répondre à l’issue de chacune d’elles sont différentes. Si, au terme d’une étape
DATA de création de table, vous devez vous demander si votre table est bien fidèle à
vos données initiales, au terme de la phase de modification des tables SAS, vous
devrez, entre autres, vous demander si le programme que vous avez soumis a bien
construit ce que vous souhaitiez.
SAS Livre Page 84 Jeudi, 18. septembre 2008 6:03 18

84 ◆ SAS

3.1 L’exécution par SAS de vos programmes


Le point traité dans cette section est extrêmement important puisqu’il doit vous
aider à comprendre pourquoi, dans certains cas, malgré l’apparente cohérence de
votre programmation, SAS ne construit pas exactement la table que vous souhaitez.
Il s’agit plus particulièrement de préciser ici comment SAS analyse et exécute les
programmes que vous lui soumettez et de voir les conséquences sur votre program-
mation de ce fonctionnement. Bien qu’introductive à ce chapitre, cette section fait
appel à des éléments de programmation que nous détaillerons plus loin dans
l’ouvrage.
Notre analyse portera sur le programme 3.2, qui modifie la table créée par le
programme 3.1.
Programme 3.1

DATA new;
INPUT ind $ X1 X2 X3 $3.;
CARDS;
Albert 1 2 A
René 1 3 A
Gino 2 3 A
Alberto 2 2 B
Guido 1 3 B
Renato 1 2 C
;RUN;

Programme 3.2

DATA new2 (KEEP=X4 X5 X1 ind);


SET new (RENAME=(X3=X4) DROP=X2);
IF X4='A' THEN X5='groupe Z A';
ELSE IF X4='B' THEN X5='groupe Z B';
ELSE X5='groupe non défini';
X1=X1*10;
RUN;

Avant tout traitement des données, SAS analyse le programme afin de vérifier s’il ne
contient pas d’erreur de syntaxe. Il est ensuite recodé en langage machine. Il n’y a
pour l’instant aucune modification de votre table. Si votre programme ne présente
pas d’erreur, son exécution peut commencer.
SAS va ensuite analyser votre programme pour créer deux (voire trois) zones logi-
ques : une première zone va rassembler l’ensemble des informations générales sur
votre table (date de création, heure de création, nom de la table, version de SAS utili-
sée) et les variables qu’elle contient (nombre, type, longueur de l’enregistre-
ment, etc.). Parallèlement, une seconde zone logique appelée PROGRAM DATA
VECTOR (PDV) va être créée. C’est dans cette zone que vont transiter vos données,
en provenance de la table précisée par l’instruction SET.
Si la table est créée à partir d’un fichier brut externe, les données seront versées dans
un premier temps dans une autre zone logique appelée INPUT BUFFER avant de
passer dans le PDV. Nous nous concentrerons uniquement dans cet ouvrage au cas
d’une modification de table déjà existante.
SAS Livre Page 85 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 85

3.1.1 Les informations descriptives de la table


Outre des informations générales sur la table (son nom, sa date et son heure de créa-
tion, la version de SAS utilisée pour sa création, etc.), vous trouverez des informa-
tions sur les variables qu’elle contient1. Ces dernières informations sont importantes
puisqu’elles structurent le PDV dans lequel les données vont transiter avant d’être
envoyées vers la table de sortie.
Le programme 3.2, interprété par SAS, offre un descriptif complet des variables qui,
in fine, seront dans la table NEW2. Ce descriptif comprend le nom des variables, leur
type, leur longueur et leur position dans l’enregistrement.
Dans la table NEW créée par le programme 3.1, la position des variables dans l’enregistre-
ment est donnée par leur ordre dans l’instruction INPUT. La longueur totale de l’enregis-
trement d’une observation est égale, dans la table NEW, à 32 octets (4 variables * 8 octets)
et non pas à 3 variables * 8 octets + 3 = 27 octets. Les cinq octets de différence ne sont pas
utilisés mais sont « mis en réserve ». Dans le programme 3.2, nous créons une variable
alphanumérique de longueur 10, la longueur totale de l’enregistrement n’augmentera que
de huit puisque deux octets parmi les cinq mis en réserve seront alors utilisés.
Nous pouvons donc comprendre l’enregistrement d’une observation, dans la table
NEW, comme une suite de 32 octets : les huits premiers sont réservés à l’enregistre-
ment de la variable IND, les huit suivants, à l’enregistrement de X1, les huit suivants
pour X2, les deux suivants pour X3 et cinq octets restent vides.
Le PDV va ensuite se structurer de la manière suivante :
• Suite à l’instruction DATA mais aussi à la lecture complète du programme, SAS
sait qu’il n’y aura que les variables X4, X5, X1 et IND dans la table NEW2,
puisqu’aucune autre variable n’est citée dans le programme et que la variable X2
n’est pas reprise de la table NEW2. Les informations offertes par la seule instruc-
tion DATA ne structurent aucunement le PDV. Elles ne seront utilisées que lors de
la phase de création de la table.
• L’instruction SET est importante dans la structuration du PDV3. Puisque la table
NEW2 est créée à partir de la table NEW, SAS peut alors reprendre certaines
informations contenues dans la table NEW :
– La variable IND alphanumérique est conservée avec sa position dans l’enregis-
trement. Première variable citée après l’instruction INPUT, IND, variable
alphanumérique dans NEW, est conservée dans NEW2 : elle est alphanumérique
et placée en première position.
– X1, variable numérique dans NEW, est conservée dans NEW2 : elle est numé-
rique et conserve sa seconde position.
– La commande RENAME indique à SAS que la variable X4 est alphanumérique
puisque, dans la table NEW, X3 était alphanumérique. X4 est placé en troi-
sième position puisque c’était la position de X3.
– Il reste à connaître le type de la variable X5 qui sera placée en quatrième position.
SAS saura dès la troisième ligne que X5 est alphanumérique lorsqu’une quote suit
le signe égale. X5 est placée en quatrième position dans l’enregistrement.

1. Ces informations peuvent être consultées au moyen de PROC CONTENTS (voir section 5.1.).
2. S’il n’y avait pas eu l’instruction DROP=X2 dans l’instruction SET, la variable X2 aurait eu une place
réservée dans de PDV même si, in fine, elle n’aurait pas fait partie de la table NEW2.
3. En cas de création de table à partir d’un fichier brut, c’est l’instruction INPUT qui est importante.
SAS Livre Page 86 Jeudi, 18. septembre 2008 6:03 18

86 ◆ SAS

La troisième information importante qui structurera le PVD est la longueur de


l’enregistrement de chacune des variables. Pour une variable numérique, ceci ne pose
pas de réel problème : si la variable est numérique, sa modalité est codée sur 8 octets.
Il existe au sein de l’étape DATA des instructions (LENGTH par exemple) qui permet-
tent de modifier le nombre d’octets utilisés pour coder les modalités numériques.
Vous pouvez, sur les variables numériques uniquement, augmenter ou diminuer cette
longueur sans aucun problème au cours d’une même étape DATA1.

3.1.2 La longueur de l’enregistrement des variables


alphanumériques
En ce qui concerne les variables alphanumériques, la longueur mesure aussi le
nombre d’octets à réserver pour l’enregistrement de la modalité. Attention cepen-
dant, il s’agit ici d’enregistrer des caractères (et non plus des nombres) sous la forme
d’une suite de 0/1 : pour enregistrer un caractère (128 ou 256 possibilités selon votre
système), il faut un octet. La longueur définit donc aussi le nombre maximal
de caractères que vous pourrez enregistrer2.
Dans notre exemple, les variables IND et X4 sont reprises de la table NEW : leurs
longueurs d’enregistrement seront donc reprises (soit 8 caractères, la longueur par
défaut des variables alphanumériques pour IND, et 3 caractères pour X4, ancienne-
ment X3 dans NEW). En ce qui concerne X5, c’est par l’analyse du programme que
SAS va déterminer sa longueur d’enregistrement. C’est au moment où X5 est cité
pour la première fois que SAS va déterminer la longueur de son enregistrement en
regardant le nombre de caractères pris par la première modalité citée. Ici, la première
modalité rencontrée est ‘groupe Z A’, soit 10 caractères.
Si la première modalité avait utilisé 2 caractères, la longueur réservée dans la
table aurait aussi été de 2. Les variables alphanumériques ont une longueur par
défaut de 8 caractères uniquement si, dans une phase de création de la table, vous
n’indiquez dans votre commande INPUT que l’INFORMAT $. sans spécifier de
longueur.
En ce qui concerne les variables alphanumériques, il est très important de
comprendre les conséquences de ce fonctionnement. À la cinquième ligne du
programme, vous observez pour la variable X5 une nouvelle modalité de 17 carac-
tères. SAS a déjà réservé 10 caractères pour cette variable alphanumérique et une
fois que cette longueur est fixée, il n’est plus possible de la modifier3 : les individus
pour lesquels va s’appliquer cette ligne de programme auront pour modalité de X5
uniquement les 10 premiers caractères de ‘groupe non défini’, soit ‘groupe non’. Si
vous souhaitez que SAS puisse enregistrer un nombre de caractères différent de
celui donné par la première modalité, il faut que vous le lui indiquiez avant que
cette première modalité n’apparaisse et, par conséquent, le plus tôt possible dans
le programme.

1. Nous verrons dans la section 5.4. qu’il peut être utile de diminuer le nombre d’octets utilisés pour
coder une variable numérique.
2. Ainsi, sur 8 octets, si votre variable est alphanumérique, vous pouvez enregistrer n’importe quelle
suite de 8 caractères alors que si votre variable est numérique, vous pouvez (sous Windows) enregistrer
n’importe quel entier jusqu’à 9 007 199 254 740 992.
3. Que ce soit à la hausse ou à la baisse.
SAS Livre Page 87 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 87

Dans le cas présent, il faut que vous introduisiez après la commande SET l’instruction
suivante :
LENGTH x5 $ 17;

Exercice 3.1 : Dans une table TEST, vous avez une variable X alphanumérique de
longueur 10. Le programme suivant est exécuté :
DATA test2;
LENGTH x $ 5.;
SET test;
x='123456789012345';
RUN;

Quelle est la longueur de X dans la table TEST2 ?

3.1.3 L’impossibilité de modifier le type de la variable


Examinons ce programme :
Programme 3.3

DATA test;
x=1;
z=1;
y='A';
RUN;

DATA test;
SET test;
IF x=1 THEN x='A';
IF z=1 THEN z='2';
IF y='A' THEN y=1;
w=y+10;
v=z||z;
u=y;
u=u+10;
RUN;

À l’issue du programme, nous obtenons :


Variable X Z Y W V U
Modalité . 2 1 11 2 2 *
Type de la variable num num alpha num alpha alpha
Longueur 8 8 1 8 24 1

X, au début de l’étape DATA/SET, est une variable numérique. Le programme tente


de lui donner une modalité alphanumérique. A la sortie du programme, X est
toujours une variable numérique et sa modalité est valeur manquante parce que ‘A’
n’est pas compris par SAS. Il vous l’indique d’ailleurs puisque vous pouvez lire dans
votre JOURNAL :
NOTE: Données numériques incorrectes, ‘A’ , dans ligne 70 colonne 15.
SAS Livre Page 88 Jeudi, 18. septembre 2008 6:03 18

88 ◆ SAS

La variable Z reste elle aussi numérique mais la chaîne de caractères ‘2’ est interprétée
par SAS pour devenir une donnée numérique. Y, au début du programme, est une
variable alphanumérique. Nous tentons de lui donner une valeur numérique, acceptée
dans une certaine mesure puisque la modalité de Y est bien ‘1’ au sortir du programme.
La variable W est la somme d’une variable alphanumérique (de modalité 1) et de 10.
Dans de tels cas, bien que vous ajoutiez une variable alphanumérique et un nombre,
SAS tentera de convertir la donnée alphanumérique en une donnée numérique pour
effectuer le calcul demandé. Ceci explique pourquoi W est une variable numérique de
modalité 11. Pour déterminer V, une fonction de concaténation « ! ! » est utilisée.
Comme on ne concatène que des caractères, V est alphanumérique. SAS va ensuite
transformer la modalité numérique de Z en une alphanumérique et concaténera bien la
chaîne de caractères « 2 » avec une seconde chaîne « 2 ». Lorsqu’elle est trans-
formée en alphanumérique, la longueur d’une variable numérique est alors égale à 12.
V aura une longueur totale de 24 caractères. Il nous reste à comprendre l’étrange moda-
lité prise par U : sa construction est proche de celle de W et on aurait dû observer une
modalité de 11 sauf que la variable U a repris les caractéristiques de Y (instruction
U=Y) et donc sa longueur : on ne peut écrire ‘11’ sur un seul caractère (octet). SAS
remplace donc ce ‘11’ par ‘*’.
Pour résumer :
• Au cours d’une étape DATA, une variable X numérique ne peut pas devenir, avec
le même nom, alphanumérique.
• Au cours d’une étape DATA, une variable Y alphanumérique ne peut pas devenir,
avec le même nom, numérique.
• Une variable numérique peut être utilisée comme alphanumérique pour la
construction d’une nouvelle variable alphanumérique.
• Une valeur numérique saisie par une variable alphanumérique peut être utilisée
pour créer une nouvelle variable numérique.
• Dans le cas d’une commande U=Y, l’égalité porte en fait sur l’ensemble des carac-
téristiques de la variable : ses modalités par observation mais aussi son type et sa
longueur d’enregistrement.
• Si pour créer une variable, vous utilisez une fonction propre aux variables alpha-
numériques (numériques), la variable créée sera alphanumérique (numérique).
La fenêtre JOURNAL vous signale les utilisations de modalités alphanumériques
comme des modalités numériques et vice versa au moyen des messages suivants :
NOTE: Valeurs alphanumériques converties en numériques valeurs aux endroits donnés
par :
(Ligne):(Colonne).
NOTE: Valeurs numériques converties en alphanumériques valeurs aux endroits donnés
par :
(Ligne):(Colonne).

3.1.4 L’exécution du programme


Nous reprenons maintenant notre analyse du programme 3.2. Les informations
relatives aux variables (nom, type, longueur, ordre dans l’enregistrement) sont
complètes, le PDV est constitué et SAS va pouvoir traiter les observations.
SAS Livre Page 89 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 89

Là aussi, il est très important de comprendre la manière dont SAS traite les
données. SAS va prendre les observations une par une pour leur appliquer le
programme. SAS va en fait exécuter votre programme un nombre de fois égal à
votre nombre d’observations. Au moment où SAS aborde la première observation,
les champs réservés dans le PDV aux différentes variables sont mis en valeurs
manquantes.

IND X1 X4 X5 Nom de la variable


descriptif

$ num $ $ Type
Bloc

8 8 3 10 Longueur
1 2 3 4 Ordre
PDV

Figure 3.1 • Le PDV – étape 1.

Puisque la table NEW2 est construite à partir de NEW, SAS va reprendre certaines
informations de la première observation pour commencer à remplir le PVD.

IND X1 X4 X5 Nom de la variable


descriptif

$ num $ $ Type
Bloc

8 8 3 10 Longueur
1 2 3 4 Ordre
PDV

Albert 1 A

Figure 3.2 • Le PDV – étape 2.

La suite du programme permet de donner une valeur à X5, puis de modifier la valeur
prise par X1 pour l’individu 1 :

IND X1 X4 X5 Nom de la variable


descriptif

$ num $ $ Type
Bloc

8 8 3 10 Longueur
1 2 3 4 Ordre
PDV

Albert 10 A Groupe Z A

Figure 3.3 • Le PDV – étape 3.

Même si une modalité est déjà présente dans le PVD, vous avez donc toujours la
possibilité de la modifier au cours du programme. Ceci est valable quelle que soit
la nature de la variable. Lorsque, pour la première observation, le programme est
exécuté entièrement, au moment où SAS lit le RUN qui clôt le programme, SAS verse
le contenu du PDV dans la table créée par l’instruction DATA (il « OUTPUT »), il
SAS Livre Page 90 Jeudi, 18. septembre 2008 6:03 18

90 ◆ SAS

réinitialise le PDV (il « RESET ») et il remonte en haut du programme pour traiter la


seconde observation (il « RETURN »).
Il existe dans chaque table un marqueur de fin de table1. Lorsque SAS rencontre ce
marqueur, il terminera l’exécution du programme par la fermeture de la table créée
par l’instruction DATA.
Au cours de cette phase d’exécution, SAS crée deux variables automatiques _N_ et
_ERROR_. _N_ augmente de 1 à chaque exécution du programme : il correspondra
donc au numéro de l’observation. Cette variable automatique peut être utilisée par
vos programmes si vous souhaitez traiter une observation dont vous connaissez le
rang2. La variable _ERROR_ prend la valeur 0 si le programme est exécuté correcte-
ment, 1 si SAS a rencontré un problème. Ce sont ces mêmes variables qui s’affichent
dans votre fenêtre JOURNAL lorsque votre programme rencontre un problème.
NOTE: Données incorrectes pour y en ligne 5 3-3.
RÈGLE : ----+----1----+----2----+----3----+----4----+----5----+----6-
5 4 a 6
x=4 y=. z=6 _ERROR_=1 _N_=2

Ce message repris de la fenêtre JOURNAL indique que, pour la deuxième observation,


SAS a rencontré une difficulté dans l’exécution de votre programme.

3.1.5 Les conséquences du RESET


Lorsque SAS termine le traitement d’une observation, il remet en valeurs manquan-
tes l’ensemble des zones du PDV avant de traiter l’observation suivante. Des fonc-
tions comme LAG permettent de « regarder en arrière »3. Nous traiterons plus
particulièrement de la fonction LAG et de ses limites dans la section 3.8.3. mais retenez
pour l’instant qu’une instruction de type :
y=LAG(x);
indique en fait à SAS de ne pas vider entièrement le PDV et de conserver dans le PDV,
d’une observation à l’autre, les modalités de X. SAS ne peut pas revenir sur une précé-
dente observation mais il peut en conserver la trace dans son PDV.

3.1.6 OUTPUT
Parmi les trois tâches qu’effectue SAS lorsqu’il a terminé d’exécuter l’ensemble des
commandes du programme (lorsqu’il arrive au RUN), nous avons vu qu’il verse le
contenu du PDV vers la table finale. Il est possible de demander à SAS de verser le PDV
dans la table finale avant que le programme ne soit terminé.

1. Vous avez la possibilité de matérialiser ce marqueur en utilisant une option END= dans l’instruction SET.
DATA test2;
SET test END=fdt;
IF fdt THEN …;
RUN;
Cette matérialisation peut vous permettre un ensemble de traitements à n’effectuer que sur la dernière
observation. Voir par exemple le programme 3.30.
2. _N_ est utilisé dans le programme 7.35 et, surtout, dans le chapitre 9 consacré au langage macro.
3. Mais il est absolument impossible, avec le langage de l’étape DATA, de regarder « en avant ».
SAS Livre Page 91 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 91

Imaginons le cas suivant : vous souhaitez placer une somme de 1 000 euros au
taux de 5 % et savoir combien vous aurez au bout d’un an, de deux ans, de trois ans
et de quatre ans :
Programme 3.4

DATA capital;
capital=1000;
annee=0;
OUTPUT;
annee=1;
capital=capital*1.05;
OUTPUT;
annee=2;
capital=capital*1.05;
OUTPUT;
annee=3;
capital=capital*1.05;
OUTPUT;
annee=4;
capital=capital*1.05;
RUN;

PROC PRINT;
RUN;

Et vous obtenez :
Résultat 3.1
Obs capital annee
1 1000.00 0
2 1050.00 1
3 1102.50 2
4 1157.63 3

En spécifiant OUTPUT, vous remarquez que le PDV n’est pas remis à zéro (puisque
les modalités continuent à être calculées) et qu’il n’y a pas de RETURN (puisque dans
le cas de cette table à une observation, un RETURN signifierait la fermeture de la
table et donc l’arrêt des calculs). Dans le cas présent, pour ANNEE=4, les données
sont aussi calculées mais elles ne sont pas versées dans la table finale. Si dans votre
programme est présente une instruction OUTPUT, la capacité de RUN à verser le
PDV dans la table finale lui est retirée.

Programme 3.5

DATA capital;
DO annee=0 TO 3;
capital=1000*(1.05)**annee;
OUTPUT;
END;
annee=4;
capital=1000*(1.05)**annee;
RUN;
SAS Livre Page 92 Jeudi, 18. septembre 2008 6:03 18

92 ◆ SAS

Ce programme est équivalent au programme 3.4 mais fait appel à des outils de
programmation non vus pour l’instant. Si vous éditez la table créée par ce programme,
vous constaterez quatre observations mais pas de donnée relative à la quatrième
année. Pour que la donnée relative à la quatrième année apparaisse, vous devez indi-
quer l’instruction OUTPUT juste avant le RUN.
Ce type de programmation permet des modifications intéressantes des dimensions
de vos tables. Sans instruction OUTPUT, si votre table de départ possède n lignes,
vous pouvez être certain que votre table finale ne pourra pas contenir strictement
plus de n lignes. Imaginons maintenant que votre table ait la structure reproduite par
le programme 3.6.

Programme 3.6

DATA test;
INPUT nom $ annee1 annee2 annee3 annee4 annee5;
CARDS;
Albert 1 2 3 4 5
Robert 6 7 8 9 10
;RUN;

PROC PRINT;
RUN;

Nous souhaitons en fait obtenir une table possédant trois variables : une variable
NOM, une variable ANNEE et une variable X reprenant en colonnes les informations
qui sont présentées ici en lignes. Cette modification de dimension de la table ne peut
être obtenue, au sein d’une étape DATA, qu’au moyen d’instructions OUTPUT dans
votre programme :

Programme 3.7

DATA test2;
SET test;
annee=1;
x=annee1;
OUTPUT;
annee=2;
x=annee2;
OUTPUT;
annee=3;
x=annee3;
OUTPUT;
annee=4;
x=annee4;
OUTPUT;
annee=5;
x=annee5;
OUTPUT;
KEEP nom annee x;
RUN;
SAS Livre Page 93 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 93

Et vous obtiendrez :
Résultat 3.2
Obs nom annee x
1 Albert 1 1
2 Albert 2 2
3 Albert 3 3
4 Albert 4 4
5 Albert 5 5
6 Robert 1 6
7 Robert 2 7
8 Robert 3 8
9 Robert 4 9
10 Robert 5 10

3.1.7 RETURN
Lorsque SAS rencontre le RUN et qu’il est en phase de construction de la table, il
retourne en haut du programme pour traiter l’observation suivante si elle existe. Au
cours de votre programme, vous avez moyen de lui indiquer, avant que celui-ci ne
soit entièrement examiné, de passer à l’observation suivante.
Programme 3.8

DATA test;
INPUT X @@;
CARDS;
1 2 3 4 5 6
;RUN;

DATA test;
SET test;
Y=x*10;
IF x>3 THEN DO;
Z=x*100;
RETURN;
END;
w=x*1000;
RUN;

Pour obtenir :
Résultat 3.3
Obs X Y Z w
1 1 10 . 1000
2 2 20 . 2000
3 3 30 . 3000
4 4 40 400 .
5 5 50 500 .
6 6 60 600 .

Sans instruction RETURN, W serait construit pour l’ensemble des observations de la


table. Ici, lorsque X n’est pas strictement supérieur à 3, les instructions qui suivent
DO ne sont pas appliquées et, par conséquent, W sera calculé. Dans le cas où X est
strictement supérieur à 3, W n’est pas construit parce que, parmi les instructions que
SAS rencontre, il observe un RETURN qui signifie : « Tu as terminé d’appliquer le
programme pour l’observation courante, tu peux verser le PDV dans la table, retourner
en haut du programme et passer à l’observation suivante. »
SAS Livre Page 94 Jeudi, 18. septembre 2008 6:03 18

94 ◆ SAS

Cette instruction sera particulièrement utile dans le cas de programmes très longs sur
des bases importantes pour économiser du temps de calcul par exemple.
Maintenant que nous avons compris les bases du fonctionnement interne du logiciel
SAS dans les étapes de modification des tables, nous pouvons examiner les outils qui
permettent de modifier et d’enrichir les tables.

3.2 Les opérateurs et les fonctions usuelles de


construction et de transformation de variables
SAS fournit des opérateurs et des fonctions pour construire et transformer les
variables. Seuls les plus usuels vous seront présentés ici. Pour une liste complète des
fonctions possibles, vous pouvez consulter l’aide SAS1.

3.2.1 Les opérateurs2


Ils sont ici énumérés par priorité décroissante :
Priorité 1
Puissance **
Changement de signe +, –
Minimum des opérandes ><
Maximum des opérandes <>
Non not ou ^ ou ~
Priorité 2
Multiplication *
Division /
Priorité 3
Addition +
Soustraction –
Priorité 4
Concaténation || ou ! ! (sur variables alphanumériques : AB||CD = ABCD2
Priorité 5
Égal =
Différent de NE ou ^= ou ~=
Inférieur < ou LT
Inférieur ou égal <= ou LE
Supérieur > ou GT
Supérieur ou égal >= ou GE
Appartient à IN
Exemple : X IN (v1, v2, v3, …,vn) [parenthèses obligatoires]
Depuis SAS 9, vous pouvez aussi utiliser IN de la manière
suivante : X IN (v1, v2:v3, v4, v5:v6)

1. Dans l’aide SAS, onglet Sommaire : SAS PRODUCTS / BASE SAS / SAS LANGAGE DICTIONNARY/
DICTIONNARY OF LANGAGE ELEMENTS / FUNCTIONS AND CALL ROUTINES.
2. La concaténation sera examinée plus en détail dans la section 3.2.7.
SAS Livre Page 95 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 95

Note : les opérateurs de comparaison peuvent être combinés sans faire appel à des
opérateurs booléens. Exemple :
IF x>10 AND x<15 THEN …;
est équivalent à
IF 10<x<15 THEN…;

IF x<10 OR x>15 THEN …;


est équivalent à
IF 10>x>15 THEN… ;
IMPORTANT : Les valeurs manquantes sont inférieures à TOUT. Ainsi, pour :
IF x<4 THEN ok=1;
OK=1 si x est valeur manquante.

Priorité 6
Et AND ou &
Priorité 7
Ou OR ou / ou |

3.2.2 Les fonctions numériques usuelles


Ces fonctions interviendront, sauf mention contraire, dans vos programmes de la
manière suivante : FCT(A) ou A est soit une constante numérique, une variable ou
une combinaison de variables.
ABS
Valeur absolue.
EXP
Exponentielle.
INT
Partie entière.
FLOOR
Plus grand entier supérieur ou égal à l’argument.
CEIL
Plus petit entier inférieur ou égal à l’argument.
LOG
Logarithme népérien.
LOG10
Logarithme décimal.
SAS Livre Page 96 Jeudi, 18. septembre 2008 6:03 18

96 ◆ SAS

MOD
Modulo. MOD (A,B) donne le reste de la division de A par B.
ROUND
Arrondi à l’entier le plus proche. Attention, si vous souhaitez un arrondi à quatre
chiffres après la virgule, vous devrez utiliser la programmation suivante :
X=ROUND(Y,0.0001).
SIGN
Signe de l’argument. Renvoie –1 si < 0, 1 si > 0.
SQRT
Racine carrée.

3.2.3 Les fonctions statistiques


Ces fonctions s’appliquent sur plusieurs variables. Vous pouvez déclarer les variables
à analyser de deux manières :
• FCT(OF X1-X12) pour analyser les variables X1, X2, … X12.
• FCT(X1,X2,X3) pour analyser les variables X1, X2 et X3.
MAX
Maximum.
MIN
Minimum des valeurs non manquantes.
N
Nombre de valeurs non manquantes.
NMISS
Nombre de valeurs manquantes.
MEAN
Moyenne des valeurs non manquantes.
STD
Écart-type des valeurs non manquantes.
SUM
Somme des valeurs non manquantes.
VAR
Variance des valeurs non manquantes.
Ces fonctions sont des fonctions « lignes » et non « colonnes » : elles ne vous permet-
tront pas d’obtenir la valeur maximale prise par une variable sur une population
considérée. Soit la table suivante :
Obs X1 X2 X3 X4
1 4 5 6 7
2 7 5 6 8
3 9 4 3 11
SAS Livre Page 97 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 97

Avec la fonction MAX, vous pouvez construire une nouvelle variable au moyen de la
ligne suivante au sein d’une étape DATA :
test=MAX(x1, x2, x3, x4);
ou encore :
test=MAX(of x1-x4);
TEST, nouvelle variable, prendra les valeurs 7 (observation n˚ 1), 8 (observation n˚ 2)
et 11 (observation n˚ 3).

3.2.4 Les fonctions particulières aux séries temporelles


DIFn
Différence. Exemple : DIF2(Z) vous donnera Zt – Zt–2.
LAGn
Retard. Exemple : LAG5(Zt) vous donnera Zt–5.
Si n n’est pas spécifié, il est égal à 1. Les particularités de ces fonctions seront évoquées
plus en détail dans la section 3.8.3.

3.2.5 Les générateurs de nombres aléatoires


La commande est de la forme RANloi(S) où S est un entier qui sert à contrôler
l’initialisation du générateur de base :
• Si s <= 0 : initialisation par l’horloge. La séquence n’est pas reproductible.
• Si s > 0 : s est le premier point de la congruence. La séquence est reproductible.
Les générateurs :
RANUNI
Loi uniforme sur [0 ; 1]. Autre nom de cette fonction : UNIFORME.
RANNOR
Loi normale N(0,1). Autre nom de cette fonction : NORMAL.
RANBIN
Loi binomiale (ajouter après le S les paramètres N et P de votre binomiale).
RANCAU
Loi de Cauchy.
RANEXP
Loi exponentielle.
RANGAM
Loi gamma (ajouter après le S, après une virgule, le paramètre de votre gamma).
RANPOI
Loi Poisson (ajouter après le S, après une virgule, le paramètre de votre poisson).
SAS Livre Page 98 Jeudi, 18. septembre 2008 6:03 18

98 ◆ SAS

3.2.6 Les fonctions sur les chaînes de caractères


SAS 9.0 a été l’occasion de l’introduction de 53 nouvelles fonctions sur chaîne
de caractères1. Le lecteur intéressé par une présentation complète de ces nouvelles
fonctions pourra consulter le lien suivant :
support.sas.com/documentation/whatsnew/91x/lrdictwhatsnew900.htm
mais aussi un document pdf très intéressant rédigé par Tim Muir :
www.hasug.org/newsletters/hasug200511/Muir_Character_Function_Fun.pdf
Avec SAS 9.2, ce sont huit nouvelles fonctions qui ont été ajoutées (CATQ, CHAR,
COUNTW, FINDW, FIRST, TRANSTRN, WHICHC et WHICHN). Il est possible
que les utilisateurs de SAS 8.2 ne disposent pas de l’ensemble des fonctions qui vont
être présentées ici2.
L’argument de ces fonctions peut être une variable alphanumérique ou une chaîne
de caractères saisie entre quotes (simples ou doubles). Pour bien comprendre l’utilité
de certaines de ces fonctions, vous devez avoir à l’esprit que les variables alphanumé-
riques sont alignées à gauche par défaut (c’est nécessaire pour trier les chaînes
de caractères dans l’ordre alphabétique).
RIGHT(X)
Alignement à droite.
LEFT(X)
Alignement à gauche.
LENGTH(X)
Longueur de la chaîne X.
TRIM(X)
Supprimer les blancs à droite.
STRIP(X)
Alignement à gauche, puis suppression des blancs à droite.
UPCASE(X)
Convertir en majuscules.
LOWCASE(X)
Convertir en minuscules.

1. Ces nouvelles fonctions sont : ANYALNUM, ANYALPHA, ANYCNTRL, ANYDIGIT, ANYFIRST,


ANYGRAPH, ANYLOWER, ANYNAME, ANYPRINT, ANYPUNCT, ANYSPACE, ANYUPPER,
ANYXDIGIT, CAT, CATS, CATT, CATX, CHOOSEC, CHOOSEN, COMPARE, COMPGED, COM-
PLEV, COUNT, COUNTC, FIND, FINDC, IFC, IFN, LENGTHC, LENGTHM, LENGTHN, NLITE-
RAL, NOTALNUM, NOTALPHA, NOTCNTRL, NOTDIGIT, NOTFIRST, NOTGRAPH,
NOTLOWER, NOTNAME, NOTPRINT, NOTPUNCT, NOTSPACE, NOTUPPER, NOTXDIGIT,
NVALID, PROPCASE, PRXCHANGE, PRXPOSN, SCANQ, STRIP, SUBPAD, SUBSTRN.
2. Parmi les fonctions qui sont citées dans cette section, certaines ne sont présentes dans SAS que depuis
la version 9.1 : il s’agit de CAT, CATS, CATT, CATX, PROPCASE et COUNT. La fonction STRIP a été
introduite dans SAS 9.0.
SAS Livre Page 99 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 99

PROPCASE(X)
La première lettre de chaque mot de la chaîne de caractères est convertie en majuscule,
les lettres suivantes sont converties en minuscules.
PROPCASE(‘seBASTien rinGUEDé’) donne ‘Sébastien Ringuedé’.
COMPBL(X)
Comprimer plusieurs blancs consécutifs en un seul blanc.
SUBSTR(X,d <,n>)1
Il existe deux utilisations possibles de cette fonction.
Première utilisation : extraire de la chaîne X une sous-chaîne de longueur n en
commençant au dème caractère.
Exemple : soit une variable X qui prend la valeur ‘abcdef ’ SUBSTR (X,5,2) vous
donnera ‘ef ’.
Seconde utilisation : cette fonction permet de placer au sein d’une chaîne de caractères
une nouvelle chaîne de caractères à un emplacement donné.
Le programme 3.9 présente les deux utilisations possibles de la fonction SUBSTR.
Programme 3.9
DATA test;
X='aaa123';
y=SUBSTR(X,1,3);
SUBSTR(X,1,3)='bbb';
RUN;

Vous retrouverez dans la variable Y, la chaîne de caractères ‘aaa’ et, à l’issue


du programme, dans X, la chaîne de caractères ‘bbb123’. L’instruction
SUBSTR(X,1,3)=‘bbb’ demande donc à SAS de remplacer les trois premiers caractères
par la chaîne ‘bbb’. Si votre instruction est de la forme SUBSTR(X,1,4)=‘bbb’, X
devient ‘bbb 23’.
SCAN(X,n <,délimiteur>)
Cette fonction explore la chaîne de caractères X et donne le nème élément, les éléments
étant séparés par le délimiteur que vous pouvez spécifier (ce n’est pas obligatoire)
entre quotes. Le programme 3.10 illustre les possibilités de la fonction SCAN.
Programme 3.10
DATA test;
X1=SCAN("j’utilise la fonction scan",3);
X2=SCAN('23 24,25 26,27 28,29',3);
X3=SCAN('23 24,25 26,27 28,29',3,',');
X4=SCAN('23 24,25 26,27 28,29',3,' ,');
X5=SCAN('23 24,25 26,27 28,29',-3);
RUN;

1. Pour certaines fonctions SAS, vous devrez spécifier plusieurs arguments. Les arguments facultatifs seront
toujours encadrés par les signes <> : <,argument facultatif>. Si vous définissez l’argument facultatif (ou les
arguments facultatifs), il devra être séparé du précédent au moyen d’une virgule.
SAS Livre Page 100 Jeudi, 18. septembre 2008 6:03 18

100 ◆ SAS

Si vous ne spécifiez pas de délimiteur, SAS ne considérera que les signes suivants
comme délimiteurs :
Blanc . < ( + | & ! $ * ) ; ^ – / , %
X1 sera donc égal à « fonction » et X2 sera égal à 25. Lorsque vous spécifiez un délimi-
teur, seul celui-ci sera considéré pour saisir le nième mot que vous recherchez. Ainsi,
X3 sera égal à ‘27 28’. Pour X4, deux délimiteurs entre les quotes ont été spécifiés :
l’espace (blanc) et la virgule. X4 est donc égal à 25.
Si le chiffre indiqué après la chaîne de caractères est positif, SCAN analyse la chaîne
de caractères en partant de la gauche ; s’il est négatif, la chaîne est examinée à partir
de la droite. Ainsi, X5 est égal à 27.
Lorsque la fonction SCAN est utilisée, les variables qui sont construites ont par défaut
une longueur égale à 200 caractères. Il est possible de limiter le nombre de caractères
à réserver aux variables qui vont être construites par la commande SCAN au moyen
d’une instruction LENGTH. Celle-ci doit intervenir en haut du programme et peut
prendre la forme suivante :
LENGTH x1-x5 $ 8;

FIND (chaîne, chaîne recherchée <,modifieur>)


Renvoie la position dans la chaîne de caractères de la chaîne de caractères recherchée. La
fonction INDEX ressemble à la fonction FIND mais elle présente moins de possibilités.
Programme 3.11
DATA test;
chaine='abc abc DEF ghiabc abc';
x1=FIND(chaine,'abc');
x2=FIND(chaine,'def');
x3=FIND(chaine,'def','i');
x4=FIND(chaine,'ghi');
x5=FIND(chaine,'abc',8);
x6=FIND(chaine,'abc abc ');
x7=FIND(chaine,'abc abc ','t');
RUN;

Pour X1, on recherche la position de la première chaîne de caractère ‘abc’ dans la


modalité de la variable CHAINE. Vous obtiendrez 1. La chaîne ‘def ’ n’est pas présente
dans la modalité de CHAINE. Pour que la recherche ne soit pas sensible à la casse,
vous pouvez introduire le modifieur ‘i’. X3 est alors égal à 10 (il apparaît deux blancs
entre les deux premiers ‘abc’).
La chaîne ‘ghi’ est bien détectée et débute en 14e position (la fonction FIND ne
recherche donc pas un mot, encadré par des délimiteurs, mais bien une chaîne
de caractères). Pour X5, nous demandons de ne rechercher la chaîne ‘abc’ qu’à partir
du 8e caractère. X5 est par conséquent égal à 17. X6 est égal à zéro parce que la chaîne
‘abc ‘ (6 blancs après ‘abc’) n’est pas présente. En revanche, si vous employez le
modifieur ‘t’, les blancs situés à droite de la chaîne recherchée et à droite de la chaîne à
explorer sont supprimés : X7 est alors égal à 17.
INDEX se différencie de FIND dans le sens où :
• Vous ne pouvez pas rechercher une chaîne de caractères sans prendre en compte
la casse (modifieur ‘i’).
SAS Livre Page 101 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 101

• Vous ne pouvez pas éliminer les blancs à droite qui pourraient intervenir dans les
chaînes de caractères à explorer et à rechercher (modifieur ‘t’).
• INDEX regarde obligatoirement de gauche à droite à partir du premier caractère :
vous ne pouvez pas demander une recherche à partir du nième caractère.
TRANSWRD (chaîne, extrait à trouver, à remplacer par)
Dans une chaîne de caractères, permet de remplacer une chaîne de caractères par une
autre.
Programme 3.12
DATA test;
chaine='abc abc DEF ghiabc abc';
chaine=TRANWRD(chaine,'abc','000');
RUN;

Dans cet exemple, la chaîne ‘abc’ est remplacée par ‘000’. La variable CHAINE à l’issue
du programme a donc pour modalité : ‘000 000 DEF ghi000 000’.
COUNTW (chaîne<, delimiteurs><,modifieur(s)>)
Très attendue par les utilisateurs SAS et introduite avec SAS 9.2, cette fonction permet
de compter le nombre de mots d’une chaîne de caractères. Le programme 3.13
propose quelques exemples d’application :
Programme 3.13
DATA test;
x1=COUNTW("la cigale et la fourmi");
x2=COUNTW("la cigale et l’abeille");
x3=COUNTW("la cigale et l’abeille","‘ ");
x4=COUNTW("SAS/DATA/SAS GRAPH/PROC PRINT/ODS");
x5=COUNTW("SAS/DATA/SAS GRAPH/PROC PRINT/ODS",,'p');
x6=COUNTW("penses-tu à grand-mère ?");
x7=COUNTW("penses-tu à grand-mère ?",,'p');
x8=COUNTW("penses-tu à grand-mère ?",' ','p');
RUN;

X1 sera égal à 5, ce qui est juste, et X2 à 4 ; ce qui est faux. Les délimiteurs de mots par
défaut sont, si votre ordinateur utilise des caractères ASCII :
blank ! $ % & ( ) * + , – . / ; < ^ |
Pour la chaîne de caractères ‘la cigale et l’abeille’, il faut aussi considérer l’apostrophe
comme un délimiteur : ceci est possible si vous spécifiez vous-même vos délimiteurs
de mots. La construction de la variable X3 utilise cette possibilité en spécifiant l’apos-
trophe et l’espace (blank) comme seuls délimiteurs possibles. Pour X4, puisque
l’espace et ‘/’ sont considérés comme des délimiteurs par défaut, COUNTW comptera
7 mots. Pour la construction de la variable X5, nous demandons via le modifieur ‘P’ à
ce que seuls les caractères de ponctuation (et donc « / ») soient considérés comme des
délimiteurs : X5 est donc égal à 5. Si vous souhaitez utiliser les possibilités offertes par
les modifieurs, attention à bien spécifier les modifieurs en troisième position comme
dans le cas de la construction des variables X5, X7 et X8. Pour X5, si vous retirez une
virgule, vous demandez en fait à ce que seul le caractère ‘p’ soit considéré comme un
délimiteur de mots (et vous obtiendrez 3).
SAS Livre Page 102 Jeudi, 18. septembre 2008 6:03 18

102 ◆ SAS

La chaîne de caractères « penses-tu à grand-mère ? » compte, selon les règles de la


langue française, 4 mots (« penses », « tu », « à » et « grand-mère »). SAS ne permet
pas de compter correctement le nombre de mots de cette chaîne de caractères :
• X6 est égal à 6 parce que le point d’interrogation est compté comme un mot (il
n’est pas délimiteur).
• X7 est égal à 3 puisque seules les marques de ponctuation sont comptées comme
délimiteurs. Les trois mots sont « pensez », « vous à grand » et « mère »,
• X8 est égal à 5 : les signes de ponctuation et l’espace sont considérés comme des
délimiteurs.
Pour les variables X5, X7 et X8, nous avons utilisé le modifieur ‘p’. Il existe dix-neuf
autres modifieurs possibles pour la fonction COUNTW. Pour plus de détails sur ces
modifieurs, consultez l’aide SAS (entrée COUNTW) ou l’aide en ligne :
(SAS 9.2) : support.sas.com/documentation/cdl/en/lrdict/59540/HTML/default/
a002977495.htm
Les utilisateurs de versions de SAS antérieures à SAS 9.2 peuvent aussi compter le
nombre de mots d’une chaîne de caractères mais ils doivent pour cela utiliser la fonction
SCAN comme le montre le programme 3.141 :
Programme 3.14
DATA test;
chaine = "la cigale et l’abeille";
nbr_mot = 1;
DO UNTIL (SCAN(chaine, nbr_mot," '")='');
nbr_mot+1;
END;
nbr_mot+(-1);
RUN;

3.2.7 La concaténation de variables alphanumériques


La concaténation des variables alphanumériques n’est pas sans poser de difficultés.
Pour vous en convaincre, regardons la table suivante :
Programme 3.15

DATA test;
INPUT (X Y Z) ($);
CARDS;
a abc c
ab ab f
abc a i
;RUN;
DATA test;
SET test;
C=X||','||Y||','||Z;
RUN;

1. On utilise ici une boucle DO UNTIL (voir section 3.6.3.) grâce à laquelle la variable NBR_MOT
construite par incrémentation (voir section 3.4.2.) augmente de 1 à chaque tour de boucle. La boucle
cessera de tourner lorsque la fonction SCAN trouvera la chaîne ‘’ (vide) : on est alors à la fin de la
chaîne de caractères examinée. En retirant 1 au résultat, on obtient bien le nombre de mots de la chaîne
de caractères. Merci de revenir par la suite sur ce programme.
SAS Livre Page 103 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 103

Pour concaténer des variables alphanumériques, vous utilisez la commande | |. Via un


PROC PRINT, vous obtenez le résultat suivant :
Résultat 3.4
Obs X Y Z C
1 a abc c a ,abc ,c
2 ab ab f ab ,ab ,f
3 abc a i abc ,a ,i

Vous auriez plutôt souhaité un résultat de la forme ‘a,abc,c’. Votre résultat actuel est
lié à la forme particulière de l’enregistrement des variables alphanumériques. Les
variables X Y et Z ont la longueur par défaut des variables alphanumériques, soit
8 caractères. Les modalités des variables sont placées à gauche dans l’enregistrement :
ceci explique que lorsque vous concaténez vos variables, vous observez la modalité,
puis un certain nombre d’espaces, la virgule et le texte de la seconde modalité.

a....... abc..... c.......

Figure 3.4 • Organisation de l’enregistrement des variables alphanumériques.

Pour obtenir le résultat ‘a,abc,c’ souhaité, vous devez indiquer à SAS d’effacer les espaces
qui pourraient se trouver à droite de la modalité : c’est l’objet de la fonction TRIM.

Programme 3.16

DATA test;
SET test;
CB=TRIM(X)||','||TRIM(Y)||','||Z;
RUN;

Pour obtenir :
Résultat 3.5
Obs X Y Z CB
1 a abc c a,abc,c
2 ab ab f ab,ab,f
3 abc a i abc,a,i

Cette fonction TRIM n’a d’intérêt que dans une phase de concaténation : elle a pour
objectif non pas de placer la modalité à droite, mais de ne pas considérer les espaces à
droite en cas de concaténation. Si vous voulez vraiment placer la modalité à droite, vous
devrez utiliser la fonction RIGHT(X). La fonction CATX permet de systématiser ces
concaténations en retirant les blancs qui peuvent intervenir à droite ou à gauche et insère
les séparateurs de votre choix. Le programme 3.17 est équivalent au programme 3.16.

Programme 3.17

DATA test;
SET test;
C=CATX(',',X,Y,Z);
CC=CATX(',',X,'@',Y,'123 456',Z);
RUN;
SAS Livre Page 104 Jeudi, 18. septembre 2008 6:03 18

104 ◆ SAS

Le séparateur doit être indiqué en premier. Vous indiquez ensuite les variables à conca-
téner ou directement des chaînes de caractères comme dans le cas de la construction
de la variable CC. Les fonctions CAT, CATS et CATT sont relativement proches de
CATX sauf que vous ne pouvez pas spécifier de séparateurs. CAT concatène sans retirer
les blancs qui pourraient apparaître à droite et à gauche, CATS concatène en retirant
les blancs à droite et à gauche, CATT ne retire que les blancs à droite.
Exercice 3.2 : Retrouvez sur Internet le texte d’un poème de Raymond Queneau
intitulé IXATNU SIOFNNUT I AVAY. Construisez une table SAS avec le texte de ce
poème. Les 36 vers doivent être repris dans quatre variables nommées V1 à V4. Votre
table aura donc 9 observations, la variable V1 reprend le premier, cinquième,
neuvième… vers.
1. Créez quatre nouvelles variables, copies de V1-V4, dans lesquelles vous aurez
remplacé toutes les occurrences de « taxi », quelle que soit la casse, par « para ».
2. Réunissez les vers 3 et 4 (V3 et V4) dans une nouvelle variable.
3. Créez quatre nouvelles variables reprenant les derniers mots des vers V1 et V3,
puis les deuxièmes lettres de ces mots.
4. Renversez l’ordre des lettres de ces derniers mots et remplacez les mots de départ
par leur « inverse ». (Vous aurez besoin pour répondre à cette question de lire la
section 3.4.1. et de faire connaissance avec le FORMAT $REVERSw.)
5. Refaites les questions 3 et 4 en remplaçant cette fois-ci le troisième mot par son
inverse.
6. Combien y a-t-il de lettres dans chacun des vers ? (« taxi taxi » ne compte que 8
lettres.)
Pour répondre aux questions posées, vous aurez très souvent besoin de « nester »
différentes fonctions. Ainsi, si vous avez une variable alphanumérique X enregistrée
sur 12 caractères et contenant un mot quelconque, LENGTH(X) sera égal à 12 (quel
que soit son nombre de caractères). En revanche, LENGTH(TRIM(X)) vous donnera
bien le nombre de caractères du mot contenu dans votre variable.
Nous avons présenté la fonction SUBSTR de la manière suivante :
SUBSTR(X,d,n)=‘texte’
Ici, dans la modalité de X, SAS remplace les n caractères à partir du dème par « texte ».
Vous découvrirez grâce à cet exercice que la commande :
SUBSTR(X,Y,Z)=W
dans laquelle Y, Z et W sont des variables est possible. Vous remplacez ici dans la
modalité de X les n caractères (information enregistrée comme modalité de Z), à
partir du dème (information enregistrée comme modalité de Y), par le texte enregis-
tré comme modalité de W. Cette possibilité est aussi valable pour les autres fonc-
tions texte.

3.2.8 Les fonctions propres aux dates


Nous avons vu lors de l’examen des INFORMAT de date qu’une date pour SAS est un
nombre de jours qui sépare la date en question du 1er janvier 1960. Lors de la création
de la table, pour faire comprendre qu’une modalité donnée saisit une date, vous devez
SAS Livre Page 105 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 105

entrer l’INFORMAT correct. Au cours d’une étape DATA, vous pouvez faire
comprendre à SAS qu’une variable saisira une date au moyen d’une instruction :
X='13mar2008’d
C’est le suffixe « d » suivant la date saisie entre quotes (simples ou doubles) qui
indique à SAS qu’il doit interpréter le texte comme une date1.
Deux remarques :
• Les mois doivent être saisis au moyen de trois lettres – il s’agit impérativement des
abréviations anglaises des mois, soit JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG,
SEP, OCT, NOV, DEC. Si vous modifiez la langue par défaut par une commande
OPTIONS DFLANG=FRENCH, cela ne change rien : vous ne pourrez pas utiliser
les abréviations françaises.
• Attention au YEARCUTOFF si vous n’indiquez que deux chiffres dans votre date
(voir section 2.8.3.b.)
MDY(MM,JJ,AA)
Convertit en nombre de jours depuis le 1er janvier 1960 une date saisie par son mois
(MM), son jour (JJ) et son année (AA).
Exemple : MDY(3,13,2008) = 17604 (le 13 mars 2008)
YEAR(date)
Renvoie l’année d’une date donnée.
QTR(date)
Renvoie le trimestre d’une date donnée.
MONTH(date)
Renvoie le mois d’une date donnée.
DAY(date)
Renvoie le jour dans le mois d’une date donnée.
WEEKDAY(date)
Renvoie le jour dans la semaine d’une date donnée.
(1 : dimanche, 2 : lundi…).
DATEPART(date)
Transforme une date de la forme ‘11MAR2008:14:40:25’ codée en interne comme un
nombre de secondes depuis de 1er janvier 1960 en date mesuré par un nombre de
jours depuis le 1er janvier 1960.
TIMEPART(date)
Transforme une date de la forme ‘11MAR2008:14:40:25’ codée en interne comme un
nombre de secondes depuis de 1er janvier 1960 en un nombre de secondes écoulées
depuis minuit du jour considéré.

1. Vous emploierez le suffixe « t » pour faire comprendre à SAS que 12:34 (ou 12:34:00) est une heure et
le suffixe « dt » si vous avez un enregistrement date/heure de la forme ‘11MAR2008:14:40:25’, cette
date/heure sera recodée par SAS comme un nombre de secondes depuis le 1er janvier 1960, 0:00:00.
Les heures sont recodées comme un nombre de secondes depuis minuit.
SAS Livre Page 106 Jeudi, 18. septembre 2008 6:03 18

106 ◆ SAS

DATE() ou TODAY()
Renvoie la date de l’horloge interne de SAS. On n’a pas besoin d’argument dans cette
fonction – il faut tout de même indiquer les deux parenthèses.

DATETIME()
Transforme la date de l’horloge interne de SAS en nombre de secondes depuis le
1er janvier 1960.

INTNX (‘période’,var_date, nbr)


Permet d’avancer ou de reculer une date saisie dans VAR_DATE d’un certain nombre
de périodes (nbr). Le type de période (‘période’) doit être spécifié (‘day’, ‘week’,
‘month’, ‘qtr’, ‘year’, ‘hour’, ‘minute’, ‘second’…)1. Le programme 3.18 propose un
exemple d’application.

Programme 3.18
DATA test;
date='12jan2008’d;
date2=INTNX('week',date,-1);
FORMAT date date2 weekdate30.;
RUN;

Il est demandé à SAS de mettre dans DATE2 le premier jour de la première semaine
avant le 12 janvier 2008. Les dates étant saisies par un nombre de jours depuis le
1er janvier 1960, un FORMAT permettra d’afficher ces dates de façon lisible (voir
section 5.3.). Si vous demandez un PROC PRINT à l’issue du programme, vous
observerez le résultat 3.6.
Résultat 3.6
Obs date date2

1 Saturday, January 12, 2008 Sunday, December 30, 2007

Par défaut, les semaines commencent le dimanche. La semaine précédant la semaine


contenant le 12 janvier commençait le dimanche 30 décembre. Si vous choisissez
‘month‘ dans cette instruction :
date2=INTNX('month',date,+1);
SAS vous donnera le premier jour du mois suivant votre date. Si vous demandez
‘year‘, ce sera le premier jour de l’année de votre date augmenté du nombre de périodes
que vous aurez précisé. Il s’agit là du fonctionnement par défaut de SAS.
Il est possible de modifier ce fonctionnement par défaut en changeant « l’aligne-
ment », quatrième argument optionnel de la fonction INTNX. Cet alignement peut
prendre les valeurs b (beginning), m (middle) et e (end).

1. Voir l’aide SAS pour plus de définition de périodes (entrée INTCK functions / interval boundaries and).
SAS Livre Page 107 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 107

Programme 3.19
DATA test;
date='12jan2008’d;
date2=INTNX('week',date,-1,'b');
date3=INTNX('week',date,-1,'m');
date4=INTNX('week',date,-1,'e');
FORMAT date date2-date4 weekdate30.;
RUN;

Vous obtiendrez :
DATE2 : Sunday, December 30, 2007
soit le jour qui débute la semaine qui précède le 12/01/08.
DATE3 : Wednesday, January 2, 2008
soit le jour au milieu de la semaine qui précède le 12/01/08.
DATE4 : Saturday, January 5, 2008
soit le jour qui termine la semaine qui précède le 12/01/08.
INTCK(‘période’, de la date, à la date)
Permet de calculer le nombre de périodes (type de période à préciser) entre deux
dates.
Ici, si vous demandez :
dif1=INTCK('month',date1,date2);
Vous obtiendrez le nombre de mois entre le premier jour du mois qui contient la
date1 et le premier jour du mois qui contient la date2. Il y a ainsi un mois entre le
31 janvier 2008 et le 1er février 2008. De la même manière, il y a une année entre
n’importe quelle date de 2007 et n’importe quelle date de 2008.
DATDIF et YRDIF (date de début, date de fin, ‘méthode’)
Les fonctions DATDIF et YRDIF calculent la différence exprimée en années entre
deux dates. Ces fonctions calculent en fait un nombre de jours qui est ensuite
exprimé en années. Vous devez spécifier à SAS la méthode à utiliser pour calculer les
durées des mois et des années. Quatre méthodes sont possibles :
1. ‘ACT/ACT’ permet d’utiliser le nombre réel de jours dans les mois et le nombre
réel de jours dans les années. Il s’agit en fait du nombre de jours dans les années
de 365 jours divisé par 365, auquel on ajoute le nombre de jours des années de
366 jours divisé par 366 jours.
YRDIF('01mar07’d, '01mar08'd, 'act/act') donne 1.00229. 366 jours séparent
ces deux dates : 306 jours sur 2007 et 60 jours sur 2008 soit
1.00229 année = 306 / 365 + 60 / 366.
2. ‘30/360’ pour forcer le nombre de jours par mois à 30 et le nombre de jours dans
l’année à 360.
YRDIF('01mar07’d, '01mar08'd, '30/360') donne 1 puisqu’il y a exactement
12 mois de 30 jours entre les deux dates et qu’une année dure 360 jours.
SAS Livre Page 108 Jeudi, 18. septembre 2008 6:03 18

108 ◆ SAS

3. ‘ACT/360’ pour utiliser le nombre de jours réel dans les mois et forcer le nombre
de jours dans une année à 360 jours.
YRDIF('01mar07'’d, '01mar08’d, 'act/360') donne 1.01667 * 360 = 366 jours.
4. ‘ACT/365’ pour utiliser le nombre de jours réel dans les mois et forcer le nombre
de jours dans une année à 365.
YRDIF('01mar07’d, '01mar08'd, 'act/365') donne 1.00274 * 365 = 366 jours.
Les méthodes de calcul ACT/360 et ACT/365 ne peuvent pas être utilisées avec la
fonction DATDIF.

3.2.9 Une fonction spécifique aux valeurs manquantes


La fonction MISSING(X1) permet de savoir si les modalités de la variable X1 sont
valeurs manquantes quel que soit le type de la variable et quelle que soit la codification
retenue pour noter la valeur manquante.

3.3 Alléger une table SAS


Avant de créer les variables dont vous aurez besoin, il est possible de réduire le
nombre d’individus ou le nombre de variables de votre table afin de la rendre plus
compacte et plus légère. Des commandes spécifiques vous y aideront.

3.3.1 Effacer certaines variables/ne conserver que certaines


variables
Si vous souhaitez, pour des raisons pratiques, travailler sur une table contenant une
certaine partie de vos variables (« on enlève des colonnes »), vous passerez par les
commandes DROP ou KEEP. Ainsi, nous disposons au départ d’une table GROS que
nous allons utiliser (SET) pour construire une table PETIT. Si vous ne souhaitez
conserver que certaines variables :

Programme 3.20

DATA petit;
SET gros;
KEEP X1 X2;
RUN;

Si vous souhaitez abandonner certaines variables :


Programme 3.21

DATA test;
SET gros;
DROP X1 X2;
RUN;

Vous comprenez bien que les commandes DROP et KEEP peuvent difficilement être
présentes en même temps lors d’une même étape DATA (c’est cependant possible).
SAS Livre Page 109 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 109

Le type de programmation présenté dans les programmes 3.20 et 3.21 consomme


beaucoup de ressources. En effet, il conduit à faire passer dans le PDV l’intégralité des
variables présentes dans la table GROS pour ensuite ne verser dans la table PETIT que
certaines de ces variables. Le programme 3.22 présente une programmation plus
économe en ressources.

Programme 3.22

DATA petit;
SET gros (KEEP=x1 x2 x3);
RUN;

Ou :
DATA petit;
SET gros (DROP=x1 x2 x3);
RUN;

Dans le cas présent, au moyen de l’instruction KEEP, seules les variables listées passe-
ront par le PDV. Au moyen de l’instruction DROP, seules les variables non listées
passeront par le PDV. L’économie de ressources (temps de calcul, espace sur votre
disque dur) est flagrante lorsque l’on gère des tables comprenant quelques millions
de lignes et quelques milliers de variables.
Les instructions DROP= et KEEP= peuvent intervenir aussi bien dans l’instruction
DATA que SET. Attention cependant :
DATA test2 (DROP=X1 X2);
SET test1 (DROP= X3 X4);
..programme de modification de la table..;
RUN;

Ici, SAS part de la table TEST1 de laquelle il écarte les variables X3 et X4 : vous ne
pouvez donc pas utiliser ces dernières dans le programme de modification de la table.
L’instruction DROP= dans l’instruction DATA indique qu’il devra écarter les varia-
bles X1 et X2 pour écrire la table TEST2. Dans le corps du programme, ces variables
restent cependant disponibles : vous pouvez y faire appel pour en construire de
nouvelles.

3.3.2 Écarter ou ne conserver que certaines observations :


WHERE, IF et SELECT
Si maintenant vous souhaitez travailler sur une table ne contenant qu’une certaine
partie de vos observations (« on enlève des lignes »), vous avez le choix entre les
commandes suivantes :
• IF/THEN OUTPUT ou IF/THEN DELETE;
• WHERE;
• SELECT/WHEN/OTHERWISE.
SAS Livre Page 110 Jeudi, 18. septembre 2008 6:03 18

110 ◆ SAS

a. IF
Imaginons que nous disposions d’une table dans laquelle sont présents à la fois des
hommes et des femmes. Le sexe de l’individu est saisi au moyen d’une variable égale
à 0 si l’individu est un homme et 1 s’il s’agit d’une femme. Nous ne souhaitons
effectuer des analyses que sur la population féminine.

Programme 3.23

DATA femme;
SET ensemble;
IF sexe=0 THEN DELETE;
RUN;

ou encore,

Programme 3.24

DATA femme;
SET ensemble;
IF sexe=1;
RUN;

IF SEXE=1; est donc équivalent à IF SEXE=0 THEN DELETE;

Programme 3.25

DATA femme;
SET ensemble;
IF sexe=1 THEN OUTPUT;
RUN;

Dans le programme 3.25, si la condition définie par le IF est remplie, alors l’individu
doit aller dans la table à créer (définie par DATA). Autre possibilité, si vous souhaitez
scinder votre table en deux :

Programme 3.26

DATA femme homme;


SET ensemble;
IF sexe=1 THEN OUTPUT femme;
ELSE OUTPUT homme;
RUN;

La forme à employer dépend de la nature de votre variable définissant l’éligibilité –


avec une variable à deux modalités, toutes les formes sont possibles ; avec une varia-
ble prenant plus de modalités, certaines formes peuvent apparaître plus fastidieuses à
écrire.
L’instruction IF, spécifique à l’étape DATA, dispose dans SAS d’un statut particulier
puisque vous pouvez aussi bien l’utiliser pour la construction de nouvelles variables
que pour la sélection d’observations au sein d’une table existante. Tous les opérateurs
et fonctions présentés dans la section 3.2. peuvent être utilisés avec une instruction
IF.
SAS Livre Page 111 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 111

b. WHERE
Contrairement à IF, WHERE ne peut être utilisé que pour sélectionner des observa-
tions d’une table existante. L’utilisation de WHERE est à privilégier puisque c’est la
programmation la moins consommatrice de ressources.
Programme 3.27

DATA femme;
SET ensemble (WHERE = (sexe=1));
RUN;

Bien entendu, les conditions d’éligibilité à la table finale peuvent être combinées. Si
vous disposez d’une variable saisissant la couleur des cheveux des individus (1 : blond
2 : brun 3 : châtain 4 : autre) et si vous souhaitez uniquement travailler sur les
femmes blondes :
Programme 3.28

DATA femme;
SET ensemble (WHERE = (sexe=1 AND cheveux=1));
RUN;

On peut aussi avoir :


Programme 3.29

DATA femme;
SET ensemble;
WHERE sexe=1 AND cheveux=1;
RUN;

Avec l’instruction WHERE, que de nombreuses procédures permettent d’utiliser, le


traitement ne sera effectué que sur une partie de votre table. A contrario, IF est une
commande spécifique à l’étape DATA : aucune procédure n’autorise cette commande.
En plus de la relative universalité de la commande WHERE, il existe d’autres caracté-
ristiques importantes qu’il convient de préciser. Les fonctions WHERE et IF ne sont
pas strictement équivalentes. Les instructions de type WHERE sont traitées en prio-
rité et conditionnent le passage dans le PROGRAM DATA VECTOR : si la condition
définie par WHERE n’est pas remplie, l’observation n’est pas versée dans le PDV.
Ce fonctionnement a deux conséquences :
• Une instruction WHERE ne peut intervenir que dans une étape DATA, incluant
un SET.
• Une instruction WHERE est moins consommatrice de ressources qu’une instruction
IF1.

1. Par conséquent, si votre table est de taille importante, essayez d’utiliser WHERE dans vos phases de
sélection d’observations. Ceci ne devrait pas poser de problème si vos conditions d’appartenance à la
table sont simples. Cependant, si les conditions sont multiples et si elles se combinent, une seule ins-
truction WHERE ne sera peut-être pas facile à écrire. Vous pourrez passer dans ce cas par la construc-
tion d’une variable temporaire ayant une certaine valeur si l’observation est à exclure, puis utiliser
pour finir IF / THEN OUTPUT ou DELETE.
SAS Livre Page 112 Jeudi, 18. septembre 2008 6:03 18

112 ◆ SAS

En effet, si votre condition est spécifiée au moyen d’une instruction IF, l’observation
passera par le PDV, même si elle ne remplit pas la condition spécifiée.
Dans une instruction WHERE, pour définir vos conditions d’éligibilité, vous pouvez
utiliser les opérateurs arithmétiques (+, –, *, /, **), les opérateurs de comparaison
(=, ^=, >, <, >=, <=, IN et leurs équivalents mnémoniques, soit respectivement EQ, NE,
GT, LT, GE, LE), les opérateurs booléens (ou opérateurs logiques : AND (&), OR (|),
NOT). Vous pouvez aussi utiliser || (concaténation), des nombres positifs ou négatifs
ainsi que les parenthèses pour spécifier l’ordre dans lequel vos conditions sont évaluées.
Cet ordre dans lequel ces conditions sont évaluées est important : vous n’aurez pas les
mêmes résultats en fonction de la position de vos parenthèses. Dans l’instruction
WHERE présentée à la figure 3.5, les parenthèses sont telles que la condition (X4=1 |
X5=1) est évaluée en premier :

WHERE x1=1 AND (x2=1 | (x3=1 AND (X4=1 | x5=1)));

1
2
3
4

Figure 3.5 • Position des parenthèses et priorités dans la résolution des instructions.

Votre résultat sera totalement différent si votre condition WHERE devient :


WHERE (((x1=1 AND x2=1) | x3=1 ) AND x4=1 ) | x5=1 ;
Vous avez la possibilité d’utiliser, au sein d’une instruction WHERE, les fonctions
habituelles de SAS que nous avons évoquées précédemment1. En revanche, vous ne
pouvez pas employer l’option OF qui apparaît dans certaines fonctions comme
MEAN(OF X1-X5) [voir les fonctions présentées dans la section 3.2.3.].
WHERE MEAN(of x1-x3)=5;
WHERE MEAN(x1,x2,x3)=5;
La première écriture de la condition WHERE conduit à une erreur de syntaxe. Pour
utiliser ce type de fonction, vous devez impérativement lister vos variables séparées
d’une virgule, comme dans la seconde instruction, pour que la condition WHERE
soit exécutée. Vous disposez de plus de certaines fonctions qui sont spécifiques à la
commande WHERE.
BETWEEN – AND
Exemple : WHERE x BETWEEN 10 AND 20;
Pour ne conserver dans votre table que les observations pour lesquelles X est supérieur
ou égal à 10 et inférieur ou égal à 20.

1. En fait, puisque WHERE ne sert qu’à sélectionner des observations d’une table existante, parmi
l’ensemble des fonctions évoquées à partir de la section 3.2.2., seules quelques-unes pourront avoir
une réelle utilité dans ce cadre (SUBSTR par exemple, uniquement dans sa première utilisation possible ;
voir section 3.2.6.).
SAS Livre Page 113 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 113

CONTAINS
Exemple : WHERE x CONTAINS 'ville' ;
WHERE x ? 'ville' ;
X est une variable alphanumérique. Seules les observations dans lesquelles la chaîne
de caractères ‘ville’ est observée dans la modalité de X seront conservées.
IS NULL ou IS MISSING
Exemple : WHERE X IS NULL;
WHERE X IS MISSING;
On ne conserve ici que les observations pour lesquelles X est valeur manquante.
Le type de la variable n’a pas d’importance.
LIKE
Exemple : WHERE x LIKE 'F%';
WHERE x LIKE 'F_e%';
WHERE x LIKE 'F_e_';
WHERE x LIKE 'F_e__';
La première instruction WHERE permet de ne conserver que les observations pour
lesquelles X commence par ‘F’. La deuxième ne conserve que les observations
pour lesquelles X commence par ‘F’ pour lesquelles X a en troisième lettre ‘e’. La troi-
sième instruction WHERE ne conservera que les observations pour lesquelles X est
de longueur 4, première lettre ‘F’, troisième lettre ‘e’. La quatrième permet de conser-
ver les observations pour lesquelles X est écrit au moyen de 5 lettres, ‘F’ est la
première lettre et ‘e’ la quatrième.
=* (ressemble phonétiquement à)
Permet de sélectionner des observations à partir d’une modalité d’une variable alpha-
numérique qui se prononce en anglais comme la chaîne que vous avez indiquée. Cette
fonction utilise un algorithme particulier appelé SOUNDEX – il n’existe pas de
version francisée de cet algorithme.
Exemple repris de l’aide SAS : si votre variable X prend les valeurs Schmitt, Smith,
Smithson, Smitt, Smythe,
WHERE X=*'Smith';
permet de ne conserver que les observations pour lesquelles X est égal à Schmitt,
Smith, Smitt et Smythe.

c. SELECT/WHEN/OTHERWISE
Afin de sélectionner des observations dans une table en fonction de certains critères,
il est aussi possible de passer par des commandes SELECT/WHEN/OTHERWISE.
Ces commandes ont une logique quelque peu différente de celles que nous avons pu
voir jusqu’à maintenant1.
Imaginons l’exemple suivant : vous disposez d’une table reprenant des informations
sur des clients situés en France et vous souhaitez envoyer à chaque direction régionale

1. Ces commandes sont en fait typiques du langage SQL.


SAS Livre Page 114 Jeudi, 18. septembre 2008 6:03 18

114 ◆ SAS

des tables ne reprenant que les informations relatives aux clients de la région dont elle
a la charge.
Programme 3.30

DATA reg1 reg2 reg3 reg4 reg5 reg6 autre;


SET France;
SELECT (dep);
WHEN ('45','37','36','41','18','28') OUTPUT reg1;
WHEN ('10','52','51') OUTPUT reg2;
WHEN ('62','59') OUTPUT reg3;
*.suite du programme..;
OTHERWISE OUTPUT autre;
END;
RUN;

Dans le présent exemple, la variable DEP est alphanumérique. Si elle est numérique,
vous devrez retirer les quotes encadrant les modalités. L’instruction WHEN indique
que si la variable DEP prend les modalités entre parenthèses, alors l’observation doit
être envoyée vers la table REG1. L’instruction OTHERWISE n’est pas obligatoire mais
permettra de regrouper les observations sur lesquelles aucune condition WHEN n’a
été vérifiée. La commande SELECT est toujours suivie d’un END.
Second exemple d’application de ce type de programmation : vous disposez d’une
table dans laquelle sont saisies les notes à un examen et vous êtes arrivé à la conclu-
sion suivante : si la note est supérieure à 6 et que ce soit un garçon, celui-ci doit être
considéré comme un bon étudiant ; si la note est supérieure à 10 et que ce soit une
fille, alors c’est une bonne étudiante. Vous souhaitez construire deux tables, une table
pour les bons étudiants et une autre pour les moins bons.

Programme 3.311

DATA bons moins_bons;


SET ensemble;
SELECT;
WHEN ((note > 10 AND sexe=2) | (note > 6 AND sexe=1))
OUTPUT bons;
OTHERWISE OUTPUT moins_bons;
END;
RUN;

Nous aborderons à nouveau les commandes SELECT/WHEN/OTHERWISE dans la


section 3.5.5. consacrée à la construction de nouvelles variables sous conditions.

1. AND étant prioritaire sur OR (|), nous pouvions tout à fait écrire la condition sous la forme :
WHEN (note > 10 AND sexe=2 | note > 6 AND sexe=1)
Nous vous recommandons plutôt la prudence dans ce genre de programmation faisant appel aux opé-
rateurs booléens en utilisant systématiquement les parenthèses comme dans ce programme. On se
souvient rarement que AND est prioritaire sur OR.
SAS Livre Page 115 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 115

3.3.3 Sélection d’observations à partir de leur numéro


d’observation
L’option POINT= de la commande SET permet d’accéder directement à une obser-
vation particulière dans une table SAS. Cette option est cependant délicate car il est
nécessaire de l’associer à d’autres commandes. Vous disposez par exemple d’une
table à partir de laquelle vous souhaitez construire une seconde table ne conservant
que le 8e individu. Un programme utilisant l’option POINT= peut alors être
utilisé :
Programme 3.32

DATA test10;
obs=8;
SET test POINT=obs;
OUTPUT;
STOP;
RUN;

Avant que la commande SET n’intervienne, vous devez déjà définir une variable
qui vous indiquera le rang de l’observation à conserver. Dans la commande SET,
vous associez à POINT le nom de cette variable. L’option POINT= doit impérati-
vement être associée à une commande STOP. Si cette commande n’est pas
présente, vous entrez dans une boucle infinie. En effet, lorsque vous utilisez
l’option POINT, SAS va directement à l’observation que vous lui avez spécifiée : il
ne verra donc pas le marqueur qui lui indique qu’il est en fin de table. La rencontre
avec ce marqueur commandant l’écriture de la table ordonnée par DATA. Sans
commande STOP, la table n’est pas écrite et votre programme continue à être
exécuté. Dans le même temps, nous avons vu que l’écriture dans la table ordonnée
par DATA s’effectuait lorsque SAS rencontrait l’instruction RUN. Dans le cas
présent, puisque le STOP interrompt l’exécution du programme, le RUN ne
commande pas l’écriture de la table et vous devez introduire une instruction
OUTPUT avant le STOP.
Cette option POINT= peut être utile si vous souhaitez par exemple créer une table
qui ne reprendra qu’une observation sur dix.

Programme 3.33

DATA test10;
DO obs=1 TO 1000 BY 10;
SET test point=obs;
OUTPUT;
END;
STOP;
RUN;

Si vous souhaitez ne conserver qu’un individu tous les p individus, vous pouvez
passer par cette programmation alternative qui utilise la fonction MOD (pour
MODulo) : cette fonction vous donne le reste entier de la division d’un chiffre par un
autre (7 : 4 = 1 ; il reste 3).
SAS Livre Page 116 Jeudi, 18. septembre 2008 6:03 18

116 ◆ SAS

Programme 3.34

DATA test10;
SET test;
IF MOD(_N_,10)=1;
RUN;

Et si vous voulez garder un individu tous les dix individus à partir du troisième :
Programme 3.35

DATA test10;
SET test;
IF MOD(_N_,10)=3;
RUN;

Attention cependant : si les deux programmations proposées ici sont équivalentes en


termes de résultat, elles ne sont pas équivalentes en termes de ressources utilisées.
En permettant un accès direct à une ou plusieurs observations, l’option POINT=
ne demande pas un examen complet de la table. La programmation alternative
proposée ici examine chacune des observations de votre table. Si votre table est de
taille importante, il est recommandé d’utiliser POINT=.
Exercice 3.3 : Dans les programmes 3.34 et 3.35, une instruction IF a été utilisée pour
sélectionner des observations. Il est pourtant recommandé dans la section 3.3.2.b.
d’utiliser plutôt la commande WHERE. Essayez de remplacer le IF par WHERE. Vous
verrez que cela ne fonctionne pas. Pourquoi ?

3.4 La construction de nouvelles variables


au sein d’une table SAS
Partant de la table que vous avez construite, vous aurez nécessairement besoin de
construire, sur base des variables déjà présentes, de nouvelles variables. Nous présentons
dans la section 3.4.2. les outils à votre disposition pour construire des variables sans
condition. La section 3.4.1. présente un outil simple qui vous permet, alors que votre
table est déjà créée, d’utiliser les INFORMATS afin de créer de nouvelles variables.

3.4.1 La conversion des variables


La fonction INPUT permet des conversions de variables en demandant l’application
d’un INFORMAT à une variable déjà présente dans votre table. Parmi les fichiers
d’accompagnement à cet ouvrage, vous trouverez une table SAS appelée DOLLAR. La
personne qui a créé la table ne se souvenait plus du nom de l’INFORMAT lui permettant
de transformer des sommes ayant la forme €1.000,00 en une donnée numérique
compréhensible par SAS. Elle a donc enregistré cette somme dans une variable alphanu-
mérique, se disant qu’elle réussirait bien un jour à lui redonner une forme numérique.
Nous avons vu dans la section 3.1.3. qu’en créant une nouvelle variable égale à la
variable alphanumérique multipliée par 1, on pouvait créer la variable numérique
souhaitée. Cela ne fonctionnera pas ici, en raison de la présence dans l’enregistrement
SAS Livre Page 117 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 117

du signe €, des « . », séparateur des milliers, et de la virgule. La transformation de


cette variable alphanumérique en une variable numérique compréhensible par SAS
peut cependant être réalisée au moyen d’une instruction INPUT.
Programme 3.36

DATA dollar;
SET lib.dollar;
ca_num=INPUT(ca,eurox12.2);
RUN;

Cette commande permet la création d’une nouvelle variable numérique CA_NUM,


égale à CA, interprétée par l’INFORMAT EUROX12.2.1 La nature de la variable créée
au moyen d’une instruction INPUT dépendra de la nature (numérique/alphanumé-
rique) de l’INFORMAT. Si vous utilisez $5. à la place d’EUROX12.2, votre variable
créée sera alphanumérique et les modalités seront égales aux cinq premiers caractères
des modalités de CA. L’élément W de l’INFORMAT doit être obligatoirement rensei-
gné : vous ne pouvez pas utiliser dans une instruction INPUT les INFORMAT dans
leur forme :INFORMAT.
Exercice 3.4 : Dans la table DOLLAR, vous trouverez une variable alphanumérique
DATE dont les modalités sont des dates présentées sous la forme d’une chaîne
de caractères : ‘13/01/2008’. Transformez cette variable alphanumérique en variable
numérique et vérifiez que cette nouvelle variable mesure bien un nombre de jours
entre la date en question et le 1er janvier 1960.

3.4.2 La construction sans condition


Vous utiliserez pour cela les différentes fonctions indiquées dans la section 3.2.
Quelques exemples :
Programme 3.37

DATA testdd;
SET testdd;
x2=x1**2;
x3=x1*56;
x4=x1/RANUNI(8);
x5=EXP((x4+x2)/x3);
x6=SUM(x1,x3,x4)/MAX(x2,x5)**(MIN(of x1-x4));
RUN;

La syntaxe est toujours identique : la variable à créer est une fonction d’autres variables
dont vous disposez au moment où est saisie la ligne de programme. Contrairement
au programme 3.37, le programme 3.38 n’a pas de sens.
Programme 3.38

DATA testdd;
SET testdd;
x6=SUM(x1,x3,x4)/MAX(x2,x5)**(MIN(of x1-x4));
x2=x1**2;

1. EUROX12.2 (sans point à la fin) est bien l’INFORMAT utilisé ici.


SAS Livre Page 118 Jeudi, 18. septembre 2008 6:03 18

118 ◆ SAS

x3=x1*56;
x4=x1/RANUNI(8);
x5=EXP((x4+x2)/x3);
RUN;

Si, dans la table au départ, vous disposez de X1, au moment où X6 est définie, SAS ne
sait pas ce que sont X3, X4 et X5. X6 sera alors valeur manquante.
La structure :
nouvelle variable = fonction d’une variable déjà présente dans la table SAS
n’est pas toujours obligatoire. Par exemple :
Programme 3.39

DATA test;
SET test;
x7+x;
t+1;
n+x**2;
RUN;

Le programme 3.39 va vous créer une nouvelle variable (X7) somme cumulée des X.
Exercice 3.5 : Quelles sont les variables qui vont être créées par t+1 et pas n+x**2 ?
La construction de variables incrémentées présente des caractéristiques différentes de
celles des variables construites par la programmation vue plus haut. Normalement,
lorsque vous construisez une variable comme une fonction d’autres variables déjà
présentes dans la table, si une de ces variables présente une valeur manquante, votre
nouvelle variable est alors, elle aussi, valeur manquante.
Les variables construites par incrémentations ne peuvent pas avoir comme modalité
une valeur manquante. Imaginons par exemple que nous disposions d’une table dans
laquelle sont reprises les notes obtenues par des étudiants à un examen. Nous avons
oublié le nom de la procédure qui calcule une moyenne et tentons donc de calculer la
moyenne de ces notes uniquement au moyen d’une étape DATA. Le programme 3.40
crée une table fictive1 :

Programme 3.40

DATA note_etudiant;
DO etu=1 TO 100;
note=ROUND(RANUNI(123)*RANUNI(234)*20+2,1);
exc=RANUNI(234);
IF note>20 THEN note=20;
IF exc<0.15 THEN note=.;
OUTPUT;
END;
RUN;

1. La construction de ce fichier fictif fait appel à des notions de programmation que nous développerons
dans les sections suivantes – merci de revenir sur ce programme par la suite.
SAS Livre Page 119 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 119

Certains étudiants sont défaillants (15 % d’étudiants défaillants). La moyenne est


calculée lors d’une étape DATA – nous ne conservons que la dernière ligne de la table
en ajoutant d’une part l’option END=XXX dans la ligne SET et en indiquant d’autre
part, IF XXX à la fin du programme.
Programme 3.41

DATA note_etudiant_M;
SET note_etudiant END=dernier;
somme_note+note;
nb_etudiant+1;
moyenne=somme_note/nb_etudiant;
IF dernier;
KEEP moyenne;
RUN;

PROC PRINT;
RUN;

Et vous obtenez 6.64 de moyenne – c’est évidemment très peu. Retirez les deux
dernières lignes du programme et regardez la table complète. Qu’observez-vous ?
Résultat 3.7
somme_
Obs etu note exc note nb_etudiant moyenne
. . .
26 26 6 0.19986 153 26 5.88462
27 27 2 0.99949 155 27 5.74074
28 28 . 0.02290 155 28 5.53571
29 29 . 0.01336 155 29 5.34483
30 30 . 0.11700 155 30 5.16667
31 31 16 0.95227 171 31 5.51613
32 32 3 0.34507 174 32 5.43750
33 33 13 0.30917 187 33 5.66667
. . .

La variable SOMME_NOTE n’est pas valeur manquante malgré le fait que pour la
calculer, vous ajoutez des notes aux valeurs manquantes (qui sont donc considérées
ici comme égales à zéro). La moyenne calculée est donc forcément fausse puisque
c’est la somme des points obtenus par les individus présents à l’examen divisée par le
nombre d’individus convoqués à l’examen. Lorsque vous utiliserez cet outil de
programmation, vous prendrez donc garde aux valeurs manquantes qui pourraient
très vite vous conduire à des résultats faux.

3.5 La construction sous conditions


Nous allons examiner dans cette section les outils dont vous pouvez disposer pour
construire des variables qui auront leurs modalités liées au respect d’une ou de
plusieurs conditions.
SAS Livre Page 120 Jeudi, 18. septembre 2008 6:03 18

120 ◆ SAS

3.5.1 Les commandes IF – THEN – ELSE


Nous disposons d’une variable CHEVEUX valant soit 1, 2, 3 ou 4. Nous souhaitons créer
à partir de cette variable quatre indicatrices : BLOND, CHATAIN, BRUN, et AUTRE.
Programme 3.42

DATA test;
SET test;
IF cheveux=1 THEN blond=1;ELSE blond=0;
IF cheveux=2 THEN brun=1;ELSE brun=0;
IF cheveux=3 THEN chatain=1;ELSE chatain=0;
IF cheveux=4 THEN autre=1;ELSE autre=0;
RUN;

La programmation exécutée ici est dangereuse puisque vous prenez la table TEST et
que vous écrivez à nouveau une table TEST : en cas de mauvaise programmation,
vous ne pourrez plus revenir à votre table initiale1!
IF détermine la condition. Si celle-ci est remplie, alors on applique le THEN;. Si elle
n’est pas remplie, on applique le ELSE. Le ELSE n’est pas obligatoire :
IF cheveux=1 THEN blond=1;
Pour les individus blonds, on observera bien BLOND=1 mais pour les autres, on aura
BLOND=. (valeur manquante). Ce qui suit le THEN peut rester vide, mais vous
devrez toujours indiquer le THEN; si vous rentrez la ligne suivante :
IF cheveux=1 THEN; ELSE BLOND=0;
Vous obtiendrez BLOND=0 pour tous les non-blonds et BLOND=. (valeur
manquante) pour les blonds.
ATTENTION : mettre un IF sans THEN/ELSE est problématique puisque, comme
nous l’avons vu dans la section 3.3.2.a.,
IF cheveux=1;
est équivalent à
IF cheveux ^=1 THEN DELETE;

3.5.2 Les commandes IF THEN/ELSE IF THEN


Nous repartons ici de la table NOTE_ETUDIANT créée par le programme 3.40.
Nous souhaitons créer à partir de la note des commentaires :
Programme 3.43

DATA note_etudiant2;
SET note_etudiant;
LENGTH conclusion $ 20;

1. Si vous commettez une erreur de programmation majeure (en rouge dans votre fenêtre JOURNAL),
comme la table demandée n’est pas créée, il n’y aura pas de problème. En revanche, si vous avez entré
une instruction qui, par exemple, efface des observations ou des variables, si vous n’avez pas de copie
de sauvegarde de votre table, vous ne pourrez pas revenir à votre table de départ (voir section 5.5.).
SAS Livre Page 121 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 121

IF note<5 THEN conclusion='aucun travail';


ELSE IF note<10 THEN conclusion='peu de travail';
ELSE IF note<13 THEN conclusion='bases acquises';
ELSE IF note<16 THEN conclusion='bon travail';
ELSE conclusion='excellent';
RUN;

Exercice 3.6 : (Rappel) à quoi sert la ligne suivante1 ?


LENGTH conclusion $ 20;
Si vous ne mettez pas les ELSE, les seuls commentaires que vous aurez seront ‘bon
travail’ et ‘excellent’.
Programme 3.44

DATA note_etudiant3;
SET note_etudiant;
LENGTH conclusion $ 20;
IF note<5 THEN conclusion='aucun travail';
IF note<10 THEN conclusion='peu de travail';
IF note<13 THEN conclusion='bases acquises';
IF note<16 THEN conclusion='bon travail';
ELSE conclusion='excellent';
RUN;

En effet, une personne qui a une note de 3 respecte la condition NOTE<16 – il


respecte aussi les autres conditions mais seule la dernière compte. Pour avoir les bons
commentaires sans utiliser l’instruction ELSE, il faudrait être beaucoup plus complet
sur les spécifications du IF en réalisant des encadrements ou en ajoutant une condition
de valeur manquante :
IF note<13 AND MISSING(conclusion) THEN conclusion='bases acquises';

Exercice 3.7 : À partir de la table NOTE_ETUDIANT créée par le programme 3.40,


écrivez le programme complet qui construira correctement la variable CONCLUSION
sans utiliser un ELSE IF. Rappel : les valeurs manquantes sont inférieures à tout.
Si vous ne prenez pas en compte ce rappel, vous aurez pour les étudiants défaillants un
commentaire « aucun travail », ce qui est inexact. Merci d’adapter votre
programmation pour donner aux défaillants une modalité spécifique.
Exercice 3.8 : Dans le fichier EXAMEN.TXT, vous allez retrouver les informations
suivantes SEPAREES par un espace :
H Damien 17/6/1986 3 5 7,2 6,9 5 5,4
Sexe / prénom / date de naissance / groupe de td / note1 / note2 / note3 / note4 / note5
Créez une table SAS avec les données relatives aux 314 étudiants de ce fichier.
1. Calculez, au moyen d’étapes DATA, la moyenne obtenue par chaque étudiant –
s’il a plus de 10 de moyenne générale, il est reçu sans mention ; si sa moyenne est

1. Voir section 3.1.2. pour la réponse.


SAS Livre Page 122 Jeudi, 18. septembre 2008 6:03 18

122 ◆ SAS

comprise entre 12 et 14, il obtient une mention AB ; si la moyenne est comprise


entre 14 et 16, il obtient une mention B ; et si la moyenne est supérieure à 16, il
aura une mention TB. Créez une variable qui indique le résultat à l’examen des
étudiants (reçu/recalé). Créez une table dans laquelle vous observez ces résultats
(sexe, prénom, date de naissance LISIBLE, groupe de TD, moyenne, résultat et
mention). Créez une seconde table destinée à l’affichage selon les principes des
jurys du Bac (seuls les admis sont présents sur la liste).
2. Créez une troisième table dans laquelle devra apparaître :
Le nombre de reçus, le pourcentage de réussites, de mentions Très Bien, et par
groupe de TD, le nombre de reçus et le pourcentage de réussites.
Cet exercice va vous apprendre à vous servir de l’instruction END (voir programme 3.41).

3.5.3 Les commandes IFN et IFC


Introduites dans SAS 9, les commandes IFN et IFC permettent la construction de
variables sous conditions de façon très simple et très rapide :
IFN(condition, valeur numérique si condition vraie, valeur numérique si condition
fausse, valeur numérique si valeur manquante)
IFC(condition, texte si condition vraie, texte si condition fausse, texte si valeur
manquante)
Vous n’êtes pas obligé de préciser la modalité à renvoyer en cas de valeur manquante
(et nous allons voir qu’il semble d’ailleurs difficile d’exploiter cette possibilité).

Programme 3.45

DATA note_etudiant4;
SET note_etudiant;
resultat=IFN(note>=10,1,0);
resultat2=IFC(note>=10 ,'reçu','recalé');
RUN;

La variable RESULTAT vaut 1 si la note est supérieure ou égale à 10, 0 sinon –


RESULTAT2, variable alphanumérique, aura pour modalité « reçu » et « recalé ».
Le lecteur attentif se dit que les étudiant défaillants ont comme modalité la même
que celle des étudiants qui ont passé l’examen et qui ont obtenu une note infé-
rieure à 10. Pour créer une troisième modalité « défaillant », la programmation
imbrique deux IFN/IFC :

Programme 3.46

DATA note_etudiant5;
SET note_etudiant;
resultat=IFN(MISSING(note),-1,IFN(note>=10,1,0));
resultat2=IFC(MISSING(note),'défaillant',IFC(note>=10 , 'reçu', 'recalé'));
RUN;

La possibilité de renvoyer une troisième modalité en cas de valeur manquante semble


difficile à exploiter étant donné que les IFN et les IFC sont tout à fait équivalents à des
structures IF/ELSE. La valeur manquante a une « valeur numérique » (elle est inférieure
SAS Livre Page 123 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 123

à tout) et si, pour construire la variable RESULTAT2, vous utilisez la commande


suivante :
resultat2=IFC(note<10 ,'recalé','reçu','défaillant');
les défaillants seront déclarés recalés puisque valeur manquante est bien inférieure à 10.

3.5.4 La commande IF/GOTO


La commande IF/GOTO peut être comprise au travers du programme 3.47.
Programme 3.47

DATA test;
INPUT x1 x2;
CARDS;
1 1
1 2
1 3
2 1
2 2
2 3
;RUN;

DATA test;
SET test;
x3=x1*10;
IF x1=1 THEN GOTO lala;
x4=-x1;
x5=-x2;
lala:
x6=-x1;
x7=-x2;
RUN;

La création de la variable X3 se fait sans condition. Les variables X4 et X5 ne sont


créées que dans le cas où la condition spécifiée après le IF n’est pas remplie. On
comprend donc que les variables X4 et X5 ne vont être créées que dans le cas où X1
est différent de 1. Les commandes qui viennent après le texte « lala: » (veuillez noter
le « : ») s’appliqueront ensuite sans condition, sur l’intégralité des observations de
votre table. Un PROC PRINT effectué à l’issue du programme vous donnera donc le
résultat 3.8.

Résultat 3.8
Obs x1 x2 x3 x4 x5 x6 x7
1 1 1 10 . . -1 -1
2 1 2 10 . . -1 -2
3 1 3 10 . . -1 -3
4 2 1 20 -2 -1 -2 -1
5 2 2 20 -2 -2 -2 -2
6 2 3 20 -2 -3 -2 -3

La structure de ce type de programme est nettement plus dure à suivre (vous spécifiez
une condition pour ensuite demander un certain nombre de tâches à effectuer si la
condition n’est pas remplie) et l’utilisation des IF/GOTO n’est pas conseillée. Un DO
simple pourra remplir exactement le même office (voir section 3.6.1.).
SAS Livre Page 124 Jeudi, 18. septembre 2008 6:03 18

124 ◆ SAS

3.5.5 Les commandes SELECT/WHEN/OTHERWISE


La commande SELECT grâce à laquelle nous avons construit plusieurs tables à partir
d’une seule en fonction de critères sur une ou plusieurs variables (voir section 3.3.2.c.)
peut aussi être utilisée pour la construction de nouvelles variables sous conditions. Le
programme 3.43 peut être réécrit avec les commandes SELECT. Il aura alors la forme
suivante :

Programme 3.48

DATA notesas;
SET notesas;
LENGTH conclusion $ 20;
SELECT;
WHEN (note<5) conclusion='rien compris';
WHEN (note<10) conclusion='peu de travail';
WHEN (note<13) conclusion='bases acquises';
WHEN (note<16) conclusion='bon travail';
OTHERWISE conclusion='excellent';
END;
RUN;

Cet exemple nous permet de comprendre en quoi la logique de ce type de commande


est différente de la logique de fonctionnement interne à SAS telle qu’elle a été décrite
dans la section 3.1. Ici, la construction de la variable sera parfaitement effectuée
(alors qu’on aurait pu s’attendre à n’avoir que deux modalités ‘bon travail’ et ‘excel-
lent’). En fait, dès qu’une observation est traitée par une condition spécifiée par le
WHEN, les instructions qui viennent ensuite ne sont pas examinées pour cette obser-
vation (alors que dans une programmation SAS, toutes les lignes du programme sont
examinées). Ceci vous explique pourquoi ce type de programmation (et donc le
langage SQL) est beaucoup plus rapide que le langage SAS standard.

3.5.6 Une dernière possibilité


Nous avons vu que la structure suivante n’était pas obligatoire :
Nouvelle variable = fonction d’une ancienne variable présente dans la table SAS
On peut en effet construire des variables incrémentées de la manière suivante :
n+1;
On peut aussi se servir de cette possibilité dans le cadre de la construction d’une
nouvelle variable avec conditions. Sur la base de la table créée par le programme 3.40,
nous souhaitons connaître le nombre d’individus qui ont eu une note strictement
supérieure à 15. Nous pouvons pour cela passer par :
Programme 3.49

DATA note_etudiant7;
SET note_etudiant;
IF note > 15 THEN compte+1;
RUN;
SAS Livre Page 125 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 125

Une autre possibilité est offerte par le programme suivant :


DATA note_etudiant8;
SET note_etudiant;
compte + (note > 15);
RUN;
Dans le cas présent, (note > 25) est compris comme une condition qui vaut 1 si
l’expression est vraie pour l’observation considérée et zéro sinon. Vous demandez
donc au moyen du programme 3.49 de créer une variable COMPTE qui augmentera
de 1 à chaque fois que vous rencontrerez un individu ayant eu une note strictement
supérieure à 15. Le nombre d’individus ayant eu plus de 15 pourra être observé sur la
dernière ligne de la table créée.
Afin de comprendre l’intérêt de ce type de programmation, imaginons le cas suivant :
nous souhaitons pouvoir créer, à partir de la variable NOTE présente dans la table
créée par le programme 3.40, une nouvelle variable qui va valoir 1 si l’étudiant a eu
moins de 5 (5/20 inclus), 2 si la note est comprise entre 5 et 10 inclus, 3 si la note est
comprise entre 10 et 15 inclus, et 4 pour les notes supérieures à 15. Vous pourriez
exécuter un programme de ce type :

Programme 3.50

notegrp = 1;
IF 5 < note <= 10 THEN notegrp = 2;
IF 10 < note <= 15 THEN notegrp = 3;
IF note > 15 THEN notegrp = 4;

La ligne suivante offrira le même résultat :


notegrp= 1 + (note>5)+(note>10)+(note>15);

3.6 Les boucles DO


Plusieurs versions du DO existent dans SAS. Mais quelle que soit la version du DO
utilisé, il est toujours terminé par un END;.
DO ;
DO simple suivi d’un ensemble d’instructions.
DO I=1 TO 10 BY 1 ;
DO itératif (BY 1 indique le pas).
DO X=3,5,12 ;
Réalise les instructions qui suivent uniquement dans le cas où X=3, X=5, et X=12.
DO WHILE (expression)
Les instructions qui suivent doivent être exécutées tant que l’expression est vraie.
DO UNTIL (expression)
Les instructions qui suivent doivent être exécutées jusqu’à ce que l’expression soit
vraie.
SAS Livre Page 126 Jeudi, 18. septembre 2008 6:03 18

126 ◆ SAS

DO sur ARRAY ;
Instruction multiple sur un bloc de variables défini par la commande ARRAY. Ce
dernier type de boucle DO sera traité dans la section 3.7.
Vous avez de plus la possibilité de combiner ces différents types de DO.
DO i= 1 TO 1000 WHILE (sum < 100);
Examinons maintenant les possibilités offertes par les boucles DO.

3.6.1 Le DO simple
Exécute un ensemble de commandes – le DO simple est généralement associé à un IF.
Programme 3.51

DATA test;
SET test;
IF x1>15 THEN DO;
x2=x4+5;
x7=x3**6;
x8=SQRT(x1);
END;
RUN;

Ici, le DO vous permet de réaliser plusieurs instructions si la condition du IF est vérifiée.


(Cette procédure devra être préférée au GOTO.)
Exercice 3.9 : Réécrivez le programme présenté dans la section consacrée à IF/GOTO
en employant un DO simple.

3.6.2 Le DO itératif
Imaginons que vous souhaitiez créer une table dans laquelle apparaîtraient 100
nombres tirés au hasard (loi uniforme). Le DO itératif vous permet cette création
simplement :
Programme 3.52

DATA test;
DO i = 1 TO 100;
rand = RANUNI(0);
OUTPUT;
END;
RUN;

Dans votre table TEST, vous retrouverez I variant de 1 à 100 et une variable RAND.
L’instruction OUTPUT est ici obligatoire. Si vous retirez cette instruction, SAS va
bien construire vos 100 tirages mais la table construite n’aura pas vos 100 obser-
vations puisqu’il placera uniquement dans votre table ce qu’il a dans le PDV au
moment du RUN : il n’y aura donc qu’une observation.
Exécutez malgré tout ce programme en retirant la commande OUTPUT. Si vous
regardez la table créée, vous constaterez que celle-ci présente bien une seule observation.
SAS Livre Page 127 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 127

De plus, vous constaterez que la variable I sera égale à 101. Ceci s’explique par le fait
que l’incrémentation de la variable I se fait au niveau de l’instruction END qui clôt la
boucle. C’est parce que la valeur 101 est strictement supérieure à la borne supérieure
que la boucle cesse de tourner1.
IMPORTANT : en cas de DO itératif, vérifiez bien votre programme de façon que
vous ne rentriez pas dans une boucle infinie ! Ensuite, n’oubliez pas que vous avez ici
une étape DATA dans laquelle une commande OUTPUT existe. Il est inutile d’intro-
duire des lignes de programmes entre END et RUN : ces lignes, si elles sont parfaite-
ment comprises par SAS, ne donneront pas naissance aux variables souhaitées dans la
table créée (voir section 3.1.6.).
Autres possibilités d’itérations :
DO I=1 TO n;
DO I=n TO 1 BY -1;
DO I=k+1 TO n-1;
DO I=1 TO k-1,k+1 TO n;
DO I=.1 TO .9 BY .1, 1 TO 10 BY 1, 20 TO 100 BY 10;
Vous avez aussi la possibilité de lister les valeurs sur lesquelles vous souhaitez que
certaines instructions soient effectuées :
DO I=2,5,8,345;

3.6.3 Les boucles DO UNTIL


Les boucles DO UNTIL permettent d’exécuter une commande jusqu’à ce qu’une
condition (à spécifier après le UNTIL) soit vraie. L’expression est estimée après
chaque exécution des instructions qui suivent : vous êtes donc sûr que vos instruc-
tions seront estimées au moins une fois. (Évaluation de l’expression « en bas de la
boucle »).

Programme 3.53

DATA test;
x=0;
DO UNTIL (86*x**2-3608*x-168=0);
x+1;
y=86*x**2-3608*x-168;
END;
RUN;

L’équation 86X2–3608X–168 admet une racine entière positive. Le programme 3.53


permet de retrouver cette racine. Attention, si vous n’introduisez pas la ligne X+1,
l’expression sera toujours estimée avec la même valeur de X (soit 0 et vous entrez
dans une boucle infinie). Si votre équation n’admet pas de racine entière positive,
vous entrez aussi dans une boucle infinie.

1. Si vous introduisez une instruction X=i avant la commande END, vous constaterez que la variable X
vaudra bien 100 alors que I vaudra 101. Nous vous recommandons par mesure de précaution de ne
jamais conserver une variable de type i en vous disant qu’elle mesure le nombre de fois où la boucle a
tourné : si une instruction OUTPUT intervient dans votre boucle, ce sera vrai ; dans le cas contraire,
ce sera faux.
SAS Livre Page 128 Jeudi, 18. septembre 2008 6:03 18

128 ◆ SAS

Vous pouvez aussi construire des programmes dans lesquels des boucles itératives
seront associées avec des conditions de type UNTIL. La structure de la boucle est
modifiée.
Programme 3.54

DATA test;
DO X=1 TO 100 UNTIL (86*X**2-3608*X-168=0);
Y=86*X**2-3608*X-168;
END;
RUN;

La boucle cessera de tourner soit lorsque X aura atteint la valeur 100, soit lorsque la
condition définie par UNTIL sera remplie. Vous ne pouvez pas entrer dans des
boucles infinies avec ce type de programmation.

3.6.4 Les boucles DO WHILE


Les boucles DO WHILE permettent d’exécuter une commande tant qu’une condition
(à spécifier après le WHILE) est vraie. L’expression est estimée avant les commandes :
contrairement à la boucle DO UNTIL, vous n’êtes pas sûr que les instructions soient
exécutées au moins une fois. (Évaluation de l’expression « en haut de la boucle »).
Exemple : Pour différentes valeurs du taux de croissance de la population, nous
souhaitons savoir au bout de combien d’années la population double.

Programme 3.55

DATA population;
DO taux = 1,2,2.5,3,4,5,10;
annee = 0;
population = 1;
DO WHILE (population < 2);
population=population*(1+taux/100);
annee+1;
END;
OUTPUT;
END;
KEEP taux annee;
RUN;

En fait, SAS va prendre la première valeur de TAUX, fixer ANNEE à 0 et POPULA-


TION à 1 ; il va ensuite regarder la population au bout d’une année. Si cette popu-
lation est inférieure à 2, il augmente de 1 la variable ANNEE et recalcule la
population. Quand la population est supérieure à 2, c’est la fin de la boucle DO
WHILE. Il passe alors à la seconde valeur du taux.
La condition à spécifier en utilisant DO UNTIL pour obtenir exactement la même
chose est :
DO UNTIL (population > 2);
Ici aussi, des commandes associant une boucle itérative et une commande WHILE
sont possibles :
DO x=1 TO 100 WHILE (condition);
SAS Livre Page 129 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 129

3.7 Les boucles sur ARRAY


Le principe des boucles sur ARRAY est de pouvoir effectuer sur un ensemble de varia-
bles des traitements identiques. Avant d’illustrer le fonctionnement de ce type de
boucle, intéressons-nous aux principes des ARRAY.

3.7.1 Principes
La commande ARRAY permet de regrouper un certain nombre de variables pour la
durée d’une étape DATA. Ce type de commande permet ensuite des traitements grou-
pés et simplifie de façon assez importante vos programmes. La structure de la
commande est la suivante :
ARRAY nom{5} x1 x2 x3 x4 x5;
Le bloc de variables appelé NOM comprend 5 membres : X1, X2, X3, X4 et X5.
Vous n’êtes pas obligé de spécifier le nombre d’éléments que contient votre bloc de varia-
bles. La lecture de votre programme sera cependant plus délicate parce qu’il devient
difficile de distinguer le nom du bloc du nom des variables intégrées à ce bloc. Il est donc
recommandé d’indiquer la dimension (le nombre de variables) que contient votre bloc.
Pour spécifier la dimension de votre bloc, vous pouvez aussi utiliser les parenthèses et
les crochets. Si vous ne connaissez pas la dimension de votre bloc, vous pouvez utiliser
l’astérisque (*).
ARRAY num{*} _NUMERIC_;
Nous regroupons par la précédente commande l’ensemble des variables numériques
de la table dans un bloc appelé NUM. Il est aussi possible d’utiliser _ALL_,
_CHARACTER_ et toutes les possibilités d’appel de listes de variables qui seront
évoquées dans la section 3.9.
Vous pouvez de plus spécifier indirectement la dimension de votre bloc au moyen de
commandes de ce style :
ARRAY nom{11:15} x11-x15;
La déclaration des variables qui composent le bloc n’est pas obligatoire mais dans ce
dernier cas, vous devez impérativement spécifier la dimension de votre bloc. Vous
pouvez ainsi avoir des instructions de la forme suivante :
ARRAY x{5};
S’il existe déjà des variables X1-X5 dans votre table, SAS les placera dans le bloc
X. Dans le cas contraire, la simple déclaration de l’ARRAY créera ces variables. Si
votre commande ARRAY a pour objectif la création de variables, il convient de préci-
ser si vos variables sont alphanumériques ou numériques. Dans le cas précédent, elles
sont numériques. La commande suivante créera des variables alphanumériques :
ARRAY x{5} $;
Enfin, il est possible d’assigner à vos variables, si vous les créez, des valeurs initiales.
ARRAY bloc1{*} $3. x1-x5 ('a' 'b' 'c' 'd' 'e');
ARRAY bloc2{*} y1-y5 (1,2,3,4,5);

Ces valeurs initiales doivent être indiquées entre parenthèses, séparées ou pas par une
virgule (par un blanc sinon), entre quotes si vos variables sont alphanumériques.
SAS Livre Page 130 Jeudi, 18. septembre 2008 6:03 18

130 ◆ SAS

Ici, nous avons souhaité créer des variables alphanumériques d’une longueur de trois.
Trois commandes équivalentes permettent d’arriver à ce résultat :
ARRAY bloc1{*} $3. x1-x5 ('a' 'b' 'c' 'd' 'e');
ARRAY bloc2{*} $3 z1-z5 ('a' 'b' 'c' 'd' 'e');
ARRAY bloc3{*} $ 3 w1-w5 ('a' 'b' 'c' 'd' 'e');
L’instruction suivante :
ARRAY x(5) _TEMPORARY_;
vous permet de créer des variables à placer dans un bloc ARRAY sans pour autant
conserver vos variables dans votre table finale. Ce type de programmation vous sera
utile lors de votre étape DATA, quand vous aurez besoin de variables intermédiaires
qui, combinées entre elles, construiront la ou les variables dont vous aurez besoin au
cours de votre analyse.
Les blocs de variables peuvent aussi être de dimension multiple. Elles se déclarent,
pour un bloc à deux dimensions, de la manière suivante :
ARRAY mult(9,9) x1-x81;
Nous verrons, dans la section suivante, au moyen d’un exemple, l’intérêt de ce type
de bloc de variables.

3.7.2 Exemples d’application


Un premier exemple simple est donné par le programme 3.56.

Programme 3.56

DATA enquete;
INFILE 'C:\intro_SAS\fichiers\enquete.txt';
INPUT personne q1-q100;
ARRAY ques{100} q1-q100;
DO index = 1 TO 100;
IF ques{index}=. THEN DELETE;
END;
RUN;

Nous créons une table dans laquelle seuls les individus qui ont répondu aux 100
questions posées subsistent. La boucle DO sur le bloc de variables défini par la
commande ARRAY vous épargne l’écriture de 100 lignes de la forme suivante :
IF q1=. THEN DELETE;
IF q2=. THEN DELETE;
Pour le second exemple, nous allons créer une table de données fictives reprenant les
notes obtenues par 100 étudiants à leurs examens (9 matières).

Programme 3.57

DATA note (DROP=i);


ARRAY result(9);
DO etu=1 TO 100;
DO i=1 TO DIM(result);
SAS Livre Page 131 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 131

result(i)=ROUND(RANNOR(25)*2+8+RANUNI(3)*4,0.1);
IF RANUNI(14)<0.05 THEN result(i)=.;
END;
OUTPUT;
END;
RUN;

La commande ARRAY permet la création de 9 variables RESULT1-RESULT9. Pour


chacun des 100 étudiants, les notes sont créées par des combinaisons de réalisations
de variables aléatoires normales et uniformes. Certaines notes sont ensuite changées
en valeurs manquantes (pour créer des défaillants). Vous remarquez que, dans la
boucle de création des notes, I varie de 1 à DIM(result). La fonction DIM(bloc)
donne la dimension d’un bloc de variables. Ce n’est pas très utile ici mais cette
commande aura son utilité quand vos blocs seront de dimensions inconnues (cas des
ARRAY bloc{*} _NUMERIC_ par exemple).
Une fois que les 9 notes sont calculées pour un étudiant donné, l’instruction
OUTPUT demande l’écriture des variables pour l’observation, et on peut déter-
miner les notes de l’étudiant suivant : c’est parce que l’on souhaite une série de
notes par étudiant que l’instruction OUTPUT intervient en bas de la boucle DO
sur ETU. Si vous faites intervenir votre instruction OUTPUT en bas de la boucle
sur I, 9 observations seront créées pour chaque étudiant. Nous souhaitons main-
tenant construire une variable alphanumérique qui indiquera les épreuves sur
lesquelles les étudiants sont déclarés défaillants. Le programme 3.58 remplit cet
objectif :

Programme 3.58

DATA note2 (DROP=i def);


SET note;
LENGTH defaillant $ 20;
ARRAY result(9);
DO i=1 TO dim(result);
IF result(i)=. THEN def=i;
ELSE def=.;
defaillant=CATX(' ',defaillant,def);
END;
RUN;

Pour un étudiant qui aurait été défaillant aux épreuves 5 et 8, par exemple, on
souhaite le résultat suivant :
. . . . 5 . . 8 .
Il faut déjà déclarer une variable alphanumérique DEFAILLANT d’une longueur
suffisante pour pouvoir contenir au moins 17 caractères (9 matières + un blanc entre
chaque résultat). Vous remarquez que nous déclarons à nouveau l’ARRAY RESULT.
C’est en effet obligatoire puisque les blocs de variables ne sont valables qu’au cours de
votre étape DATA : lorsque celle-ci se termine, l’information ARRAY n’est pas sauvée
au sein de la table.
SAS Livre Page 132 Jeudi, 18. septembre 2008 6:03 18

132 ◆ SAS

Ensuite, pour chacune des variables du bloc, si la note est manquante, nous donne-
rons à la variable DEF le numéro d’ordre de la variable dans le bloc (DEF est valeur
manquante sinon) pour ensuite concaténer à la variable DEFAILLANT la valeur de la
variable DEF.
Dans ce dernier exemple, nous allons utiliser des blocs multidimentionnels. Les notes
des étudiants peuvent être regroupées en unités d’enseignement : les notes 1 à 3
appartiennent à l’unité 1, les notes 4 à 6 à l’unité 2 et les notes 7 à 9 à la troisième
unité. Nous souhaitons calculer des moyennes par unité d’enseignement. En revan-
che, la moyenne d’une unité doit être égale à la valeur manquante si l’individu ne s’est
pas présenté à un examen de cette unité.

Programme 3.59

DATA note3(DROP=i j);


SET note2;
ARRAY result(3,3);
ARRAY moy{*} moy1-moy3;
ARRAY def(*) def1-def3;
DO i=1 TO dim1(result);
moy(i)=0;
def(i)=0;
DO j=1 TO dim2(result);
def(i)+(result(i,j)=.);
moy(i)+result(i,j)/3;
END;
IF def(i)>0 THEN moy(i)=.;
END;
RUN;

Nous savons déjà que nous disposons de 9 variables RESULTS, elles sont ici organisées
dans une ARRAY double (ARRAY RESULT(3,3)). Au cours du programme qui
suit, si vous appelez l’élément (1 ,1) de ce bloc, vous allez obtenir RESULT1 ;
RESULT9 est donc l’élément (3,3). Pour mieux comprendre les variables qui vont
être associées à un élément du bloc, vous pouvez imaginer une représentation en
forme d’arbre :
Ainsi, pour le bloc RESULT(3,3) :

dim1 dim2 var


1 1 result1
1 2 result2
1 3 result3
2 1 result4
2 2 result5
2 3 result6
3 1 result7
3 2 result8
3 3 result9
SAS Livre Page 133 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 133

Un bloc X(2,3,4) contiendra 24 variables (2 * 3 * 4 = 24) :

dim1 dim2 dim3 variable dim1 dim2 dim3 variable


1 1 1 x1 2 1 1 x13
1 1 2 x2 2 1 2 x14
1 1 3 x3 2 1 3 x15
1 1 4 x4 2 1 4 x16
1 2 1 x5 2 2 1 x17
1 2 2 x6 2 2 2 x18
1 2 3 x7 2 2 3 x19
1 2 4 x8 2 2 4 x20
1 3 1 x9 2 3 1 x21
1 3 2 x10 2 3 2 x22
1 3 3 x11 2 3 3 x23
1 3 4 x12 2 3 4 x24

Dans le programme 3.59, la première boucle débute par une mise à zéro des variables
MOY et DEF. Ensuite, à l’intérieur de la seconde boucle, on construit une variable qui
va donner le nombre de défaillances, puis on somme les notes en les divisant par 3.
Lorsque la première boucle débute, I=1, la seconde boucle (J=1 TO DIM2(RESULT))
va bien analyser les éléments (1,1), (1,2) et (1,3) du bloc, soit RESULT1, RESULT2 et
RESULT3 pour en calculer une moyenne.
À la sortie de la boucle sur J, nous disposons d’une moyenne, calculée au moyen
d’une incrémentation et d’un nombre de défaillances sur l’unité d’enseignement.
La moyenne calculée n’est cependant pas bonne si l’étudiant est défaillant à au
moins une épreuve : en effet, lorsqu’on construit une variable au moyen d’une
incrémentation, si des valeurs manquantes se trouvent parmi les modalités, le
processus d’incrémentation les considère comme égales à 0 (voir section 3.4.2.). Ce
que nous souhaitons, c’est qu’en cas de défaillance, la moyenne ne soit pas calculée
mais qu’elle soit égale à valeur manquante.
Exercice 3.10 : Modifiez la programmation que vous avez utilisée dans l’exercice
EXAMEN.TXT en utilisant les boucles DO sur ARRAY.
Exercice 3.11 : Suite à une innovation pédagogique, les unités d’enseignement ont été
redéfinies : pour obtenir la moyenne de l’unité 1, vous devez maintenant calculer la
moyenne des notes 1, 4 et 7. L’unité 2 regroupe les notes 2, 5 et 8, l’unité 3 regroupe les
notes 3, 6 et 9. Modifiez le programme 3.59 de façon à recalculer correctement
les moyennes des notes obtenues pour les trois unités.
Exercice 3.12 : Reprenez le programme 3.57 en retirant la ligne qui crée des notes
défaillantes. Une nouvelle réforme pédagogique vient d’intervenir : les notes font l’objet
de pondérations différentes : les notes 1, 5 et 9 sont pondérées avec un coefficient 3 ; les
notes 2, 4 et 8 sont pondérées avec un coefficient 2 ; les notes 3, 6 et 7 sont pondérées avec
un coefficient 1. Les blocs d’enseignement restent ceux définis dans le programme 3.59.
Calculez les moyennes obtenues à chacun des blocs.
SAS Livre Page 134 Jeudi, 18. septembre 2008 6:03 18

134 ◆ SAS

Exercice 3.13 : Un bloc de variables a été créé au moyen de l’instruction suivante :


ARRAY Y(3,3,5);
1. Combien de variables sont présentes dans ce bloc de variables ?
2. Quel est le nom de la variable qui correspond aux éléments (1,3,5), (2,2,4), (3,3,4)
de ce bloc ?

3.8 Donner une mémoire à SAS


Nous avons vu qu’en traitant les informations une par une, au moment de traiter une
donnée, SAS n’avait aucun souvenir de la donnée précédente (voir section 3.1.5.).
Il existe cependant certaines fonctions qui forcent SAS à conserver une trace des
valeurs établies pour des observations déjà traitées. SAS est donc capable de « se
souvenir ». Toutefois, les limites de cette capacité sont réelles.

3.8.1 La commande RETAIN


Cette commande RETAIN permet à SAS de se rappeler la valeur prise par une variable
donnée pour une observation précédente. Imaginons que nous disposons d’une table
que nous pensons triée de façon croissante sur une variable X donnée. Nous souhaitons
pouvoir vérifier que ce tri est juste :

Programme 3.60

DATA test;
INPUT X @@;
CARDS;
1 2 4 3 7 6
;RUN;
DATA test;
SET test;
RETAIN lastx .;
IF x < lastx THEN
PUT "l’observation n’est pas dans l’ordre, x=" x;
ELSE lastx = x;
RUN;

Pour que SAS ait une mémoire, il faut modifier le fonctionnement du PDV et empê-
cher le RESET qui remet les champs du PDV en valeurs manquantes avant que SAS
ne traite une nouvelle observation. C’est ce que permet l’instruction RETAIN. Il est
possible de préciser la valeur de LASTX avant que SAS n’aborde la première observation.
Dans le programme 3.60, LASTX est égal à valeur manquante.
Quand SAS aborde le premier individu, il regarde si LASTX est bien inférieur à la
modalité de X de cet individu (c’est bien le cas puisque la valeur manquante est infé-
rieure à tout) – le THEN ne s’applique donc pas et c’est le ELSE qui va s’appliquer :
SAS fixe donc une nouvelle valeur à LASTX égale à la valeur de X constatée pour le
premier individu.
SAS Livre Page 135 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 135

Comme LASTX est une variable RETAIN, lorsque SAS examine le second individu, il
ne vide pas le PDV en mettant toutes les valeurs des variables à valeurs manquantes.
Il conserve ainsi la valeur de LASTX égale au X de la première observation. Abordons
maintenant la seconde observation : imaginons qu’un X soit inférieur au X du
premier individu (l’ordre n’est donc pas respecté). À ce moment-là, le THEN s’appli-
que et l’instruction PUT demande à SAS d’écrire dans la fenêtre JOURNAL un
message suivi de la valeur X problématique.

3.8.2 La commande RETAIN alliée aux options FIRST et LAST


Comprenons avant tout le fonctionnement des options FIRST et LAST. Il ne s’agit pas
ici de commandes mais d’informations construites lorsque vous triez une table en
fonction d’une clé.
Imaginons que nous disposons d’une table TEST0 dans laquelle il existe une variable
qui sert d’identifiant. Au cours d’une première étape, les données sont triées en fonction
de cet identifiant au moyen de la procédure PROC SORT.

Programme 3.61

DATA test0;
INPUT identifiant @@;
CARDS;
5 3 4 3 4 4 1 2
;RUN;
PROC SORT DATA=test0; <- demande de tri de la table test0
BY identifiant; <- la clef de tri (tri croissant par défaut)1
RUN;
DATA test;SET test0;
BY identifiant;
IF first.identifiant ^= last.identifiant;
RUN;

Nous avons ici un programme qui va mettre les individus présents plus d’une fois
dans la table dans une table spécifique. Dans l’étape DATA, nous reprécisons la clé de
tri par une instruction BY et les variables cachées FIRST et LAST peuvent alors être
utilisées. En fait, deux informations sont créées :
• FIRST.identifiant vaut 1 si c’est la première fois que SAS voit cette valeur de la
variable identifiant et 0 sinon.
• LAST.identifiant vaut 1 si c’est la dernière fois que SAS voit cet identifiant (SAS
regarde donc « devant »)2 et 0 sinon.
Facilitons votre compréhension du programme au moyen de la figure 3.6.

1. PROC SORT sera présenté plus en détail dans la section 4.2.1.


2. Mais c’est un leurre : c’est la procédure PROC SORT qui crée les FIRST et LAST. Par le rappel de la clé
de tri, on demande en fait à SAS de ressortir ces informations, issues de PROC SORT. Une étape DATA
seule ne peut pas regarder pour une ligne n les informations présentées en ligne n+1.
SAS Livre Page 136 Jeudi, 18. septembre 2008 6:03 18

136 ◆ SAS

Identifiant first.identifiant last.identifiant résultat


1 1 1 écarté de la table test
2 1 1 écarté de la table test
3 1 0 dans la table test
3 0 1 dans la table test
4 1 0 dans la table test
4 0 0 écarté de la table test
4 0 1 dans la table test
5 1 1 écarté de la table test

Figure 3.6 • Illustration du fonctionnement de FIRST et LAST.

À l’issue de l’étape DATA, nous savons donc que nous devons regarder de plus près ce
qui se passe sur les individus 3 et 4. Gardez à l’esprit que la ligne :
IF first.identifiant ^= last.identifiant;
est équivalente à :
IF first.identifiant = last.identifiant THEN DELETE;
IF first.identifiant ^= last.identifiant THEN OUTPUT;
Les variables FIRST et LAST alliées à un RETAIN peuvent être particulièrement inté-
ressantes : nous disposons d’une table dans laquelle, pour 3 individus (1, 2 et 3), est
donnée une information (variable X) mesurée à divers moments. Ces informations
sont reprises dans le tableau suivant.

Ind X Ind X Ind X

1 16 2 10 3 59
1 12 2 20 3 45
1 19 2 8 3 2
1 15 2 14 3 18
1 18 2 30
1 17

À partir de la table SAS reprenant ces informations, nous souhaitons pouvoir créer
une table dans laquelle, pour chaque individu, nous allons disposer des trois valeurs
de X les plus élevées. Le programme s’écrit dans ce cas :

Programme 3.621

LIBNAME lib 'C:\intro_SAS\fichiers';


PROC SORT DATA=lib.grp;
BY ind;
RUN;
DATA max;
SET lib.grp;
BY ind;

1. Vous trouverez la table GRP dans les fichiers exemples de cet ouvrage que vous pouvez télécharger sur le site
compagnon : www.sas-sr.com
SAS Livre Page 137 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 137

RETAIN x1-x3;
IF first.ind THEN DO;
x1 = .; x2 = .; x3 = .;
END;

IF x >= x1 THEN DO; *(1);


x3 = x2; x2 = x1; x1 = x;
END;
ELSE IF x >= x2 THEN DO; *(2);
x3 = x2; x2 = x;
END;
ELSE IF x >= x3 THEN x3 = x;*(3);

IF last.ind THEN OUTPUT;


KEEP ind x1-x3;
RUN;

Puisque nous allons utiliser FIRST et LAST, nous devons dans un premier temps
rappeler la clé de tri. Les variables X1 à X3 sont des variables RETAIN. Nous ne préci-
sons par leurs valeurs au départ mais par défaut, celles-ci sont égales à valeur
manquante. Lorsque c’est la première fois que l’individu est vu, nous demandons une
initialisation à valeur manquante des variables X1 à X3. Cette instruction est impor-
tante pour traiter correctement les individus 2 et 3. En l’absence de cette instruction,
nous pourrions aborder ces individus avec des informations relatives à l’individu
précédent. Ensuite, indépendamment du fait que l’observation soit FIRST ou LAST,
les commandes IF/ELSE IF ((1) (2) et (3)), expliquées plus en détail à la figure 3.7,
s’appliquent. Lorsque sera abordée la dernière observation relative à cet individu, le
PDV sera versé dans la table finale.
Regardons comment s’appliquent les IF/ELSE IF sur les données de l’individu 1 – les
cinq premières colonnes vous donnent l’état du PDV après le traitement des obser-
vations relatives à l’individu 1.

Ind X X1 X2 X3 quelle ligne Commentaires


est
appliquée ?

. . . Initialisation
1 16 16 . . (1) Puisque 16>., 16 est placé en X1
1 12 16 12 . (2) 12<16 et 12>., 12 est placé en X2
1 19 19 16 12 (1) 19>16 et décalage : 12 passe en X3,
16 passe en X2 et 19 est placé en X1
1 15 19 16 15 (3) 15<19 et 15<16 mais 15>12 :
remplacement
1 18 19 18 16 (2) idem
1 17 19 18 17 Nous sommes à last.ind=1 : le PDV
est envoyé vers la table et SAS peux
passer à l’individu 2

Figure 3.7 • Illustration du fonctionnement du programme 3.62.

Dans le fichier d’OUTPUT (MAX), il ne nous restera pour l’individu 1 que la variable
IND et les variables X1-X3. Il était possible de faire autrement en triant au préalable
les données de la table de départ en fonction de IND et de X. On peut même si on le
SAS Livre Page 138 Jeudi, 18. septembre 2008 6:03 18

138 ◆ SAS

souhaite retenir les six valeurs les plus élevées (ce qui serait délicat avec une program-
mation analogue à celle examinée précédemment).
Programme 3.63

PROC SORT DATA=lib.grp;


BY ind DESCENDING x;
RUN;

Nous demandons un tri à deux clés : 1er clé (IND) croissante et seconde clé (donc à
IND identiques) décroissante (variable X).
Ensuite :
Programme 3.64

DATA test1; SET lib.grp;


BY ind;
RETAIN x1-x6;
IF first.ind THEN DO;
x1 = .; x2 = .; x3 = .;x4 = .; x5 = .; x6 = .;
END;
IF x>=x1 THEN x1=x;
ELSE IF x>=x2 THEN x2=x;
ELSE IF x>=x3 THEN x3=x;
ELSE IF x>=x4 THEN x4=x;
ELSE IF x>=x5 THEN x5=x;
ELSE IF x>=x6 THEN x6=x;
IF last.ind THEN OUTPUT;
RUN;

On tire avantage du fait que les valeurs de X sont triées par individus. Si vous avez
plusieurs clés de tri et que vous souhaitiez faire appel aux fonctionnalités FIRST et
LAST sur une autre clé de tri, vous devrez indiquer vos différentes clés.
Programme 3.65

PROC SORT DATA=test;


BY X1 X2;
RUN;
DATA test;
SET test;
BY x1 x2;
IF last.x2 ....

Dans le cas du programme 3.64, puisque vous n’avez pas indiqué que la table était
triée en fonction de IND puis, de manière décroissante, en fonction de X, un appel à
FIRST.X ou LAST.X est impossible. Il aurait fallu pour cela indiquer :
BY ind DESCENDING x ;

Exercice 3.14 : Le fichier ÉLECTION2002.TXT, sur quatre colonnes, donne les


résultats du premier tour de l’élection présidentielle de 2002. La première variable est
le département (codé en deux chiffres ou deux lettres), la seconde est le département
en toutes lettres, puis le nom du candidat et enfin le pourcentage des votes exprimés
SAS Livre Page 139 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 139

que ce candidat a réalisé dans le département en question. Le séparateur des


modalités est le « ; ».
1. Sur la base de ce fichier, créez une table SAS (révision).
2. Créez une seconde table dans laquelle vous pourrez lire pour chaque candidat les
noms des trois départements dans lesquels ils ont réalisé les scores les plus
importants ainsi que ce score.

3.8.3 Faire référence à des valeurs passées


Dans les cas les plus simples, vous n’aurez pas besoin de RETAIN. Vous disposez
d’une série Xt et vous souhaitez calculer Yt = Xt + Xt-1. La fonction LAG suffira :
Programme 3.66

DATA test;
SET test;
x_1=LAG(x);
y=x+x_1;
RUN;

La fonction LAG est cependant piégeuse comme va vous le montrer le


programme 3.67. La variable X doit être considérée comme un identifiant ; Y est la
variable à analyser.
Programme 3.67

DATA test;
INPUT X Y;
CARDS;
1 1
1 2
1 3
1 4
2 1
2 2
2 3
2 4
3 1
3 2
3 3
3 4
;RUN;

PROC SORT DATA=test;


BY X Y;
RUN;

DATA test;SET test;


BY X Y;
IF first.X THEN dif_Y=Y;
ELSE dif_Y=Y-LAG(Y);
RUN;

Le programme présenté ici cherche à calculer la différence entre le Y de l’observation


et le Y de l’observation précédente si celle-ci est relative au même individu (saisi par
SAS Livre Page 140 Jeudi, 18. septembre 2008 6:03 18

140 ◆ SAS

la variable X). DIF_Y doit être égal à Y si ce n’est pas le cas. Avec les données de la
table TEST construite par le programme 3.67, DIF_Y doit donc être égal à 1 quelle
que soit l’observation. Vous examinez le programme et vous vous dites qu’il doit
parfaitement fonctionner. Exécutez ce programme, puis demandez un PROC PRINT.
Vous verrez que cela ne fonctionne pas :

Résultat 3.9
Obs X Y dif_Y
1 1 1 1
2 1 2 .
3 1 3 1
4 1 4 1
5 2 1 1
6 2 2 -2
7 2 3 1
8 2 4 1
9 3 1 1
10 3 2 -2
11 3 3 1
12 3 4 1

Pourquoi ? Parce que, SAS fonctionne ligne de données par ligne de données et que,
une fois la ligne passée, s’il n’a pas mis d’informations en réserve, il ne peut pas revenir
en arrière. SAS ne fait que vous en donner l’impression.
Comprenons ce qui se passe en interne. Lorsque SAS passe sur la première observa-
tion, le ELSE ne s’applique pas, il ne sait donc pas qu’il va devoir conserver dans le
PDV la valeur de la variable Y comme une commande RETAIN pourrait le faire.
Lorsqu’il arrive sur la seconde observation, comme à la précédente observation, il ne
sait pas qu’il va devoir retarder la variable Y (et donc conserver sa valeur dans le
PDV) ; lorsqu’on lui demande LAG(Y), il renvoie « valeur manquante » et, par
conséquent, 2 – valeur manquante = valeur manquante.
En revanche, comme le ELSE s’applique, il met en réserve la valeur de Y au cas où on
la lui demanderait plus tard. Lors de l’examen de la troisième observation, puisque le
ELSE s’applique, il ressort la valeur de Y qu’il a vue lors de la deuxième observation
pour calculer DIF_Y.
Passons à la cinquième observation : le ELSE ne s’applique pas et donc, en interne, la
valeur réservée pour LAG(Y) et qui subsiste dans PDV pour le Y observé n’est pas
modifiée. Ainsi, lorsqu’il arrive à la sixième observation, pour calculer DIF_Y, il va
utiliser la valeur de LAG Y qu’il connaît et donc la valeur observée pour la quatrième
observation, d’où : DIF_Y : 2 – 4 = -2
Prenez garde lorsque vous employez la fonction LAG (ou DIF, puisque le principe est
le même). Si vous utilisez LAG pour construire une variable sans condition
(X=LAG(Y)), vous ne devriez avoir aucun problème. Maintenant, si vous utilisez
LAG à l’intérieur de la construction d’une variable avec condition, vous n’obtiendrez
pas ce que vous souhaitez. Vous écrirez donc plutôt des programmes qui auront cette
forme (pour aboutir au résultat que l’on souhaitait au départ) :

Programme 3.68

DATA test;
SET test;
BY X Y;
dif_y=y-LAG(y);
SAS Livre Page 141 Jeudi, 18. septembre 2008 6:03 18

La modification des tables SAS ◆ 141

IF first.X THEN DO;


dif_Y=Y;
END;
RUN;

3.9 Les listes de variables


Lorsque vous créez une table SAS ou lorsque vous utilisez une procédure pour analy-
ser votre table, vous pouvez être amené à avoir besoin de lister un nombre important
de variables. Plutôt que d’écrire toutes ces variables séparées par un espace, vous
pouvez utiliser les possibilités offertes par les listes de variables.

3.9.1 Première possibilité


La commande INPUT suivante est parfaitement valide :
INPUT x1-x5;
Elle est équivalente à cette commande :
INPUT x1 x2 x3 x4 x5;
Il existe en fait interne à SAS des possibilités de créer des listes de variables. Ainsi, si
vous souhaitez créer 30 variables, vous pouvez soit en écrire la liste (perte de temps),
soit créer une liste tout simplement en appelant X1-X30 (ou VAR1-VAR30). Ici, nous
utilisons des listes avec des préfixes identiques. Il est possible de demander des statis-
tiques simples sur les variables X1-X30 par la procédure PROC MEANS (voir
section 6.2. pour plus de détails sur cette procédure). Vous pouvez écrire :

Programme 3.69

PROC MEANS DATA=test;


VAR x1-x30;
RUN;

3.9.2 Deuxième possibilité :


Imaginons que votre table contienne l’ensemble de variables suivant :
xfgr xhdt xbvr xmpo xpel
Si vous demandez des statistiques simples par la procédure PROC MEANS sur ces
variables, vous pouvez soit écrire :
Programme 3.70

PROC MEANS DATA=test;


VAR xlddk xpoiu xhrnj xrega xlsgr;
RUN;

Soit (et vous gagnez du temps)


PROC MEANS DATA=test;
VAR x:;
RUN;
SAS Livre Page 142 Jeudi, 18. septembre 2008 6:03 18

142 ◆ SAS

Merci de noter les « : » après le X. Toutes les variables dont le nom commence par X
seront traitées.

3.9.3 Troisième possibilité


Les listes prédéfinies par SAS :
_NUMERIC_ : appellera toutes les variables numériques.
_CHARACTER_ : appellera toutes les variables alphanumériques.
_ALL_ : appellera toutes les variables.

3.9.4 Quatrième possibilité


Nous avons créé une table SAS avec la ligne INPUT suivante :
INPUT a b c $ d e f $ g h i $;
• Si vous avez besoin d’appeler les variables entre B et G : B--G. .
• Si vous ne voulez que les variables numériques entre B et G : B -NUMERIC- G.
Attention : pour les blocs de variables saisies par « -- », ce n’est pas l’ordre alphabéti-
que qui est ici utilisé pour créer ces blocs mais l’ordre des variables dans votre table
SAS. Si vous ignorez cet ordre, vous pouvez le retrouver au moyen d’un PROC
CONTENTS (procédure qui vous permet de voir la structure d’une table).
Programme 3.71

PROC CONTENTS DATA=test POSITION;


RUN;

L’option POSITION permet un affichage des variables présentes dans une table dans
leur ordre d’enregistrement (#). Ainsi, vous obtiendrez un résultat proche du résultat
3.10.
Résultat 3.10
-----Alphabetic List of Variables and Attributes-----
# Variable Type Len Pos
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
3 hrnj Num 8 16
1 lddk Num 8 0
5 lsgr Num 8 32
2 poiu Num 8 8
4 rega Num 8 24

-----Variables Ordered by Position-----


# Variable Type Len Pos
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
1 lddk Num 8 0
2 poiu Num 8 8
3 hrnj Num 8 16
4 rega Num 8 24
5 lsgr Num 8 32

Si vous appelez HRNJ--REGA, vous n’obtiendrez un traitement que sur les variables
HRNJ (position 3) et REGA (position 4).
SAS Livre Page 143 Jeudi, 18. septembre 2008 6:03 18

4
Combiner les tables SAS

Au sommaire de ce chapitre :
4.1. Ajouter des individus
4.2. Ajouter des variables
4.3. La mise à jour : commande UPDATE
4.4. Les marqueurs : un outil pouvant se révéler utile dans les phases de merge
Les informations dont vous pourriez avoir besoin pour mener votre analyse peuvent
être présentes dans plusieurs tables et vous pourriez avoir besoin de réunir ces infor-
mations au sein d’une même table. Dans ce cadre, trois cas typiques sont possibles :
• Soit vous souhaitez ajouter des observations (de nouveaux individus).
• Soit vous souhaitez ajouter des informations (de nouvelles variables).
• Soit vous souhaitez mettre à jour certaines informations.
Il convient de bien savoir ce que vous souhaitez faire puisque, nous allons le montrer
dans les sections qui suivent, le type de programmation à mettre en œuvre dépend
clairement de votre objectif. Il est, dans tous les cas, indispensable de bien connaître
vos tables avant de tenter de les combiner.

4.1 Ajouter des individus


Il s’agit ici de construire une table contenant « plus de lignes ». Imaginons, cas simple,
que les tables que vous souhaitez réunir aient exactement la même structure : les noms
des variables présentes dans les deux tables sont identiques et mesure bien des choses
identiques (si X1 mesure l’âge dans une table, il mesure bien aussi l’âge dans l’autre).
Dans ce cas, la procédure à suivre est simple :
Programme 4.11

DATA test;
SET test1 test2;
RUN;

1. Les programmes présentés dans ce chapitre ne proposent pas les phases de constructions des tables nécessaires à
leur exécution. Vous retrouverez sur le site compagnon ces programmes complets : www.sas-sr.com
SAS Livre Page 144 Jeudi, 18. septembre 2008 6:03 18

144 ◆ SAS

ID X1

1 A ID X1
TEST1
2 B
3 C 1 A
4 D 2 B
5 E 3 C
6 F 4 D
5 E
SET test1 test2 ; 6 F
ID X1 7 G
8 H
7 G 9 I
TEST2

8 H 10 J
9 I 11 K
10 J 12 L
11 K
12 L

Figure 4.1 • Ajouter des individus – SET.

Et si la table n’a pas la même structure, que se passe-t-il ? Vous disposez d’une variable ID
commune mais la seconde variable, qui pourtant mesure la même chose dans les deux
tables, se nomme X1 dans la première et X2 dans la seconde table. En relançant le
programme 4.1, vous obtiendrez une table qui a la structure représentée par la figure 4.2.

ID X1

1 A ID X1 X2
TEST1

2 B
3 C 1 A
4 D 2 B
5 E 3 C
6 F 4 D
5 E
SET test1 test2 ;
6 F
ID X2 7 G
8 H
7 G 9 I
TEST2

8 H 10 J
9 I 11 K
10 J 12 L
11 K
12 L

Figure 4.2 • Instruction SET – variables non communes.

Pour résoudre ce problème, vous devez procéder comme vous le montre le


programme 4.2.
Programme 4.2

DATA test;
SET test1 test2 (RENAME = (x2=x1));
RUN;

Il est ici demandé ici à SAS de renommer dans la table TEST2 la variable X2 et de
l’appeler maintenant X1 (structure « ancien nom » = « nouveau nom »). Si vous
souhaitez en même temps renommer la variable ID en IDENT :
SAS Livre Page 145 Jeudi, 18. septembre 2008 6:03 18

Combiner les tables SAS ◆ 145

Programme 4.3

DATA test;
SET test1 (RENAME = (id=ident))
test2 (RENAME = (x2=x1 id=ident));
RUN;

Vous pouvez aussi demander à ce qu’au moment de la réunion des deux tables, les
observations d’une table soient insérées dans la seconde table en fonction de la valeur
prise par une variable, commune aux deux tables.

ID X1

1 A ID X1
TEST1

2 B
5 C 1 A
5 D 1 G
6 E 2 B
8 F 3 H
SET test1 test2 ; 5 C
BY id ; 5 D
ID X1 5 I
6 E
1 G 7 J
TEST2

3 H 8 F
5 I 10 K
7 J 10 L
10 K
10 L

Figure 4.3 • Instructions SET et BY.

Pour réaliser ce type de réunion de table, il faut au préalable que les deux tables soient
triées en fonction de la variable commune (ID dans la figure 4.3). Le résultat que vous
obtenez dépend de l’ordre dans lequel les tables sont présentées dans l’instruction
SET. Ainsi, le résultat présenté ci-dessus est obtenu via une instruction SET TEST1
TEST2. SAS lit d’abord les informations de TEST1. Dans TEST2, si une observation
contient le même identifiant, elle est placée à la suite de celle(s) de TEST1. Bien
entendu, avec une instruction SET TEST2 TEST1, le résultat différera un peu. Pour
arriver au même résultat, il demeure possible de réunir les deux tables au moyen d’un
SET TEST1 TEST2, sans instruction BY, pour ensuite demander un PROC SORT sur
la variable commune aux deux tables.

4.2 Ajouter des variables


Vous disposez maintenant de deux tables présentant des informations différentes
pour un même individu. Il s’agit donc de constituer une table qui contiendra
l’ensemble des informations relatives aux individus. La réunion des deux tables va
s’effectuer en fonction de variable(s) commune(s) que l’on appelle clé(s). La réunion
de deux tables commence toujours par une procédure de tri des tables en fonction de
la ou des clés.
SAS Livre Page 146 Jeudi, 18. septembre 2008 6:03 18

146 ◆ SAS

4.2.1 PROC SORT


PROC SORT est la procédure qui permet de trier une table en fonction des valeurs
prises par une variable. Nous avons déjà utilisé cette procédure, notamment dans les
programmes 3.62, 3.63, 3.65 et 3.67.
PROC SORT DATA=test;
BY ind DESCENDING x;
RUN;
Deux clés de tri sont précisées ici. Le tri est par défaut croissant ou par ordre alpha-
bétique si votre clé est une variable alphanumérique. Plusieurs options, à préciser
dans la ligne PROC SORT, peuvent s’avérer utiles :
OUT=
Pour créer une nouvelle table SAS triée – la table de départ n’est pas modifiée.
TAGSORT
Option à privilégier si vous avez une table de très grande taille à trier – SAS ne trie
dans ce cas que les clés de tri et le numéro de l’observation – il joindra ce prétri aux
autres données ensuite. Cette option ne vous fait pas forcément gagner du temps
mais elle économise de la place sur le disque dur. Les procédures de tri demandent
beaucoup d’espace sur un disque dur ; si votre table fait 1 Go, vous devez disposer
d’au moins de 3 Go d’espace libre1.

NODUPKEYS
Les observations en double (mêmes valeurs aux modalités de tri) sont effacées – seule la
première observation qui propose un certain jeu de valeurs aux variables de tri est
conservée dans la table finale (fonctionne différemment dans un environnement VMS).
NODUPRECS (ou NODUP)
Les observations en double (mêmes valeurs pour l’ensemble des variables dans ta
table) peuvent être effacées – ce n’est pas certain à moins d’effectuer un tri sur
l’ensemble des variables de la table. Avant d’écrire une observation dans la table
finale, SAS regarde si l’observation précédente n’est pas exactement identique à celle
qu’il s’apprête à écrire. Si c’est le cas, il n’écrit pas la nouvelle observation. Attention,
SAS ne regarde pas l’ensemble des observations déjà écrites dans la table avant de
choisir s’il écarte ou pas l’observation courante.
Depuis SAS 9.2, une nouvelle option très intéressante est proposée :
PRESORTED
SAS analyse votre table afin de voir si elle n’est pas déjà triée. Si elle ne l’est pas, le tri
sera effectué. C’est une option intéressante quand les tables sont très volumineuses.
Les procédures de tri sont très gourmandes en ressources et il arrive souvent que l’on
trie une table alors que celle-ci est déjà triée.

1. Une autre option possible pour économiser de la place sur le disque dur est OVERWRITE qui permet
d’effacer la table de départ avant que la table triée ne soit écrite. Cette option est extrêmement dange-
reuse et ne doit être utilisée que si vous avez une copie de secours de votre table. Quand SAS trie une
table, il conserve la table de départ : en cas de problème, vous ne perdez pas celle-ci. Avec OVERWRITE,
en cas de problème, votre table est perdue.
SAS Livre Page 147 Jeudi, 18. septembre 2008 6:03 18

Combiner les tables SAS ◆ 147

4.2.2 MERGE – Cas standard


Le cas standard est résumé par la figure 4.4.

AN X1

2002 A
TEST1

2003 B
2004 C AN X1 X2
2006 D
2007 E 2001 1
2008 F 2002 A 2
MERGE test1 test2 ; 2003 B 3
BY an ; 2004 C 4
AN X2 2005 5
2006 D 6
2001 1 2007 E .
TEST2

2002 2 2008 F .
2003 3
2004 4
2005 5
2006 6

Figure 4.4 • MERGE – cas standard.

Les procédures qui suivent doivent être suivies scrupuleusement :


Pour pouvoir réunir deux tables, il faut que celles-ci contiennent des informations
sur des ensembles similaires d’individus et que ces individus soient saisis par un
identifiant commun. La procédure à suivre est, dans ce premier cas, présentée par
le programme 4.4.

Programme 4.4

PROC SORT DATA=test1;


BY an;
RUN;

PROC SORT DATA=test2;


BY an;
RUN;

DATA mergb;
MERGE test1 test2;
BY an;
RUN;

Il est démandé à SAS de trier les tables à réunir en fonction de la variable commune
(identifiant), ici AN. Ensuite, une table MERGB, résultat d’un MERGE entre TEST1
et TEST2, doit être créée. Via BY AN, nous indiquons à SAS que la variable commune
aux deux tables est AN et qu’il doit appairer les informations en fonction des modali-
tés prises par cet identifiant.
Exercice 4.1 : Réunissez les fichiers TAILLE.TXT et CHEVEUX.TXT qui contiennent
les mêmes individus mais qui offrent chacun des informations différentes (structure :
identifiant individuel et information).
SAS Livre Page 148 Jeudi, 18. septembre 2008 6:03 18

148 ◆ SAS

Si vous oubliez un élément de la programmation, vous risquez de rencontrer de sévères


problèmes :
• Premier cas. Vous oubliez de réaliser les tris en fonction de vos identifiants : SAS
ne réalisera pas le MERGE. Une instruction BY apparaît dans le programme et,
comme pour tout programme contenant un BY, si la ou les tables ne sont pas
triées au préalable, SAS ne peut pas exécuter le programme.
• Second cas. Vous ne mettez pas le BY identifiant dans le programme de MERGE.
SAS réalisera quand même le MERGE mais vous aurez une chance relativement
élevée d’obtenir n’importe quoi. Sans instruction BY, la procédure MERGE indique à
SAS de mettre deux tables l’une à côté de l’autre.
Nous reprenons le cas des tables de la figure 4.4.

AN X1

2002 A
TEST1

2003 B
2004 C
2006 D AN X1 X2
2007 E
2008 F 2001 A 1
MERGE test1 test2 ; 2002 B 2
BY an ; 2003 C 3
AN X2 2004 D 4
2005 E 5
2001 1 2006 F 6
TEST2

2002 2
2003 3
2004 4
2005 5
2006 6

Figure 4.5 • MERGE et oubli de l’instruction BY.

Ne pas indiquer de variable BY ne pose pas de problème si :


1. Les données ont été triées.
2. Les deux tables offrent des informations pour exactement les mêmes individus.
Si une des conditions n’est pas respectée, le MERGE sera effectué mais le résultat sera
toujours hasardeux. Dans le cas de la figure 4.5, les variables X1 et X2 apparaissent
dans l’ordre dans lequel elles sont dans les tables TEST1 et TEST2. La variable AN,
commune aux deux tables, apparaît telle qu’elle est dans la table TEST2. Si vous
inversez l’ordre des tables dans l’instruction MERGE, les années seront telles qu’elles
apparaîtront dans la table TEST1.

4.2.3 Le cas des séries temporelles


La réunion en passant par un BY est là aussi nécessaire. La variable citée par l’instruction
BY est, bien entendu, l’identifiant temporel.
Exercice 4.2 : Vous travaillerez pour cet exercice sur les données des fichiers
MAGA1.TXT et MAGA2.TXT. Les deux fichiers offrent quatre variables :
Structure du fichier MAGA1.TXT : jours – mois – année – X1
Structure du fichier MAGA2.TXT : jours – mois – année – X2
Merger les deux tables – vous n’avez pas le droit d’utiliser la fonction MDY.
SAS Livre Page 149 Jeudi, 18. septembre 2008 6:03 18

Combiner les tables SAS ◆ 149

4.2.4 Merger des tables de dimensions différentes


L’exercice 4.3 doit vous permettre de comprendre ce que l’on entend par « dimensions
différentes ».
Exercice 4.3 : Vous travaillerez pour cet exercice sur les données des fichiers
EMPLOYE.TXT et ETABLISSEMENT.TXT. EMPLOYE.TXT offre des informations
sur les salariés qui travaillent dans divers établissements d’une même entreprise. Vous
devez intégrer à la table des salariés les informations relatives aux établissements.
Structure du fichier EMPLOYE.TXT : nom – X1 – X2 – établissement.
Structure du fichier ETABLISSEMENT.TXT : Etablissement – E1 – E2.
Créez les deux tables, puis réunissez-les.

4.2.5 Quelques sources de problème en cas de MERGE


Les cas évoqués jusqu’ici sont des cas d’école mais, dans la réalité, les choses sont
généralement un peu plus compliquées. Vos principales difficultés seront liées à la
présence dans vos deux tables de variables portant exactement le même nom mais qui
ne peuvent pas être considérées comme des clés de réunion.
Si ces variables, communes aux deux tables, mesurent des choses différentes, vous
passerez par des instructions de type RENAME comme nous l’avons indiqué dans la
section 4.1. Maintenant, si vos variables mesurent la même chose, il est indispensable
que vous interveniez sur vos tables avant de les réunir. Le programme 4.5 crée deux
tables problématiques :

Programme 4.5

DATA table1 (KEEP = date action1 action3)


table2 (KEEP = date action1 action2);
DO date='1jan2007’d TO '31dec2007’d;
action1=RANNOR(125)*10+150;
temp=ROUND(RANUNI(22));
action2=RANNOR(254)*15+1542;
action3=RANNOR(458)*5+50;
OUTPUT table1;
action1=action1+temp;
OUTPUT table2;
END;
RUN;

DATA table2;SET table2;


IF date >'30sep2007’d;
RUN;

Dans TABLE1, nous disposons pour une série de dates, du cours de deux actions :
l’action 1 et l’action 3. Dans TABLE2, pour une série de dates plus courte (il manque le
4e trimestre), le cours de l’action 2 est observé ainsi que, une nouvelle fois, le cours
de l’action 1. Attention cependant : il existe quelques différences entre les deux séries de
cours de l’action 1 (en moyenne une ligne sur deux, le cours de l’action 1 est augmenté
de 1 par rapport aux cours observés dans la TABLE1). La variable ACTION1 est donc
présente dans les deux tables, sur des périodes différentes ; elle mesure la même chose,
SAS Livre Page 150 Jeudi, 18. septembre 2008 6:03 18

150 ◆ SAS

mais peut prendre des modalités différentes selon la table. Bien entendu, seule une de
ses séries est bonne. Si vous exécutez le programme de MERGE standard :
Programme 4.6

PROC SORT DATA=table1;


BY date;
RUN;

PROC SORT DATA=table2;


BY date;
RUN;

DATA table_a;
MERGE table1 table2;
BY date;
RUN;

Vous obtiendrez bien une réunion des deux tables. Maintenant, quel cours de
l’action 1 avez-vous ? Celui de la table 1 ou celui de la table 2 ? En fait, vous aurez le
cours proposé par la seconde table de l’instruction MERGE.
Si votre commande MERGE est plutôt :
Programme 4.7

DATA table_b;
MERGE table2 table1;
BY date;
RUN;

Le cours de l’action 1 sera celui de TABLE1. Vous avez donc peut-être écrasé la bonne
information. Dans TABLE2, il manque les données du 4e trimestre. Si vous examinez
votre table complète, quel que soit le programme de MERGE utilisé, la série de cours
d’action 1 sera toujours complète. Ainsi, lorsque vous demandez :
MERGE table1 table2;
la variable ACTION1 sera égale à ce que l’on observe sur les trois premiers
trimestres dans TABLE2 et pour le dernier trimestre, il prendra les données de
TABLE1.
Avant tout MERGE de tables, merci de vous assurer que seules la ou les variables
clés de mergeage sont communes aux tables que vous souhaitez réunir. Si ce n’est
pas le cas, passez par des RENAME, puis une fois que les tables sont réunies,
examinez vos deux variables mesurant la même chose et déterminez celle que vous
souhaitez conserver.

4.2.6 La nature des variables clés de réunion de deux


tables
Si maintenant seule votre clé de réunion est commune à vos deux tables, vous pouvez
rencontrer une dernière difficulté si l’une est enregistrée sous la forme d’une variable
alphanumérique et l’autre sous la forme d’une variable numérique. Sur la base des
tables créées lors de la section précédente, exécutez ce programme :
SAS Livre Page 151 Jeudi, 18. septembre 2008 6:03 18

Combiner les tables SAS ◆ 151

Programme 4.81

DATA table1b;
SET table1 (DROP=action1);
FORMAT date ddmmyy10.;
RUN;

DATA table2b;SET table2 (RENAME=(date=date2));


date=PUT(date2,ddmmyy10.);
DROP date2 action1;
RUN;

Si vous regardez maintenant vos deux tables au moyen d’un PROC PRINT, vous vous
dites qu’il n’y a aucun problème. Votre MERGE ne fonctionnera cependant pas puis-
que dans la table TABLE2B, la variable DATE est alphanumérique. Si vous tentez
maintenant malgré tout un MERGE, vous observerez dans votre fenêtre JOURNAL le
message d’erreur suivant :
ERREUR: La variable date a été définie comme alphanumérique et numérique.
Il convient donc aussi de vous assurer que vos variables clés sont de même type.
La question de la nature de la variable clé de réunion ne posera enfin lorsqu’il vous
semblera qu’il n’y a pas de variable clé de réunion. Ce sera par exemple le cas dans l’exer-
cice 6.1 (voir section 6.2.). Il vous faudra alors créer, dans les deux tables à réunir, une
variable à modalité unique, puis utiliser cette variable comme clé de réunion.

4.3 La mise à jour : commande UPDATE


Dans ce cas, vous disposez d’une table de base qu’il est possible de mettre à jour en y
intégrant les informations contenues dans une seconde table. Dans ce cas, vous devez
pouvoir ajouter certaines informations relatives notamment aux dernières périodes,
mais aussi modifier certaines informations auxquelles on a apporté une correction
dernièrement (par exemple, votre table de départ, portant sur une entreprise, ne
propose qu’un chiffre d’affaires approximatif pour le mois de juillet et vous ne disposez
pas d’information sur le chiffre d’affaires du mois d’août).
Par exemple, deux tables sont créées à partir des fichiers bruts UPDATEMAS-
TER.TXT et UPDATEMAJ.TXT :

Résultat 4.1
Table MASTER Tables MAJ
Numm Mois CA Numm Mois CA
1 Janvier 30 5 Mai .
2 Février 35 6 Juin 39
3 Mars 37 7 Juillet 38
4 Avril 35 8 Aout 41
5 Mai 39
6 Juin 40
7 Juillet 36

1. La fonction PUT utilisée par ce programme est décrite dans la section 5.3.7.
SAS Livre Page 152 Jeudi, 18. septembre 2008 6:03 18

152 ◆ SAS

Pour mettre à jour la table MASTER au moyen des informations contenues dans
UPDATE, la procédure à suivre est présentée par le programme 4.9 et le résultat est
illustré par la figure 4.6.
Programme 4.9

PROC SORT DATA=master;


BY numm;
RUN;

PROC SORT DATA=maj;


BY numm;
RUN;

DATA master;
UPDATE master maj;
BY numm;
RUN;

La commande UPDATE MASTER MAJ ; indique de mettre à jour la table MASTER


au moyen des informations contenues dans MAJ. L’ordre dans lequel vos tables sont
citées est donc extrêmement important. Vous obtenez à l’issue de ce programme :

Numm X1 CA

1 Janvier 30
MASTER

2 Février 35
3 Mars 37 Numm X1 CA
4 avril 35
5 Mai 39 1 Janvier 30
6 Juin 40 2 Février 35
7 Juillet 36 UPDATE master maj ; 3 Mars 37
BY numm ; 4 avril 35
5 Mai 39
6 Juin 39
Numm X1 CA 7 Juillet 38
8 Aout 41
5 Mai .
MAJ

6 Juin 39
7 Juillet 38
8 Aout 41

Figure 4.6 • La mise à jour.

SAS n’a pas effacé les données propres au mois de mai ; il a modifié les saisies dans la
table des mois de juin et de juillet ; enfin, il a ajouté les données relatives au mois
d’août qui n’apparaissaient pas dans la table initiale.
Exercice 4.4 : Vous travaillerez sur les données des fichiers MASTER.TXT, MAJ-A.TXT
et MAJ-B.TXT.
Une entreprise dispose de deux établissements A et B dont elle suit les résultats sur
deux variables X1 et X2 dans le fichier MASTER. Les comptables des deux
établissements vous font parvenir des données permettant la mise à jour de MASTER.
Structure du fichier MASTER.TXT : année – établissement – X1 – X2
Structure du fichier MAJ-A.TXT : année – X1 – X2
Structure du fichier MAJ-B.TXT : année – X1 – X2
Réalisez cette mise à jour – les choses sont moins simples qu’il n’y paraît…
SAS Livre Page 153 Jeudi, 18. septembre 2008 6:03 18

Combiner les tables SAS ◆ 153

4.4 Les marqueurs : un outil utile dans les phases


de MERGE
SAS vous offre la possibilité de créer au cours de vos étapes de MERGE (ou vos étapes
UPDATE) des marqueurs indiquant l’origine de l’information. Vous pourrez ainsi
voir dans votre table finale pour chaque individu si les informations dont vous dispo-
sez viennent de la première table, de la seconde ou des deux. Attention, ces
marqueurs sont internes à SAS : il n’y a pas création à proprement parler de variables
mais SAS gardera une trace de l’origine des données pour des traitements ultérieurs.

Programme 4.10

PROC SORT DATA=syndicat;


BY salarie;
RUN;
PROC SORT DATA=note;
BY salarie;
RUN;

DATA ensemble;
MERGE syndicat(IN=in1) note(IN=in2);
BY salarie;
IF in1 AND in2 THEN origine='double';
ELSE IF in1 THEN origine='un';
ELSE IF in2 THEN origine='deux';
IF origine='deux' THEN syndicat='non';
RUN;

Nous réalisons ici un MERGE presque classique en triant dans un premier temps les
tables en fonction de la variable sur laquelle se fera l’appariement (ici SALARIE).
Nous demandons par l’instruction IN de créer un marqueur IN1, qui sera égal à 1
dans la table finale ENSEMBLE pour les individus présents dans la table SYNDICAT,
et un second marqueur IN2, qui sera égal à 1 dans la table ENSEMBLE pour les indi-
vidus présents dans la table NOTE). La variable ORIGINE est ensuite créée : elle vaut
‘double’ si l’individu était présent dans les deux tables, ‘un’ si l’individu n’était présent
que dans la première table et ‘deux’ si l’individu n’était présent que dans la seconde
table. Bien entendu, les individus présents dans la second table mais absents de la
première présentent pour la variable SYNDICAT une valeur manquante, remplacée
par la dernière instruction avant le RUN par la modalité ‘non’.
Exercice 4.5 : Dans les fichiers SCORES1.TXT et SCORES2.TXT, vous disposez pour
un ensemble d’individus de notes à l’examen « économétrie » (dans scores1) et de
notes à l’examen « statistiques non paramétriques » (dans scores2). Vous devez créer
deux tables : dans la première table, vous n’observerez que les étudiants qui ont eu
une note aux deux examens. Dans la seconde table, doivent se retrouver les individus
qui n’ont passé qu’un examen sur les deux.
Créez ces tables.
Structure du fichier SCORES1.TXT : identifiant – note
Structure du fichier SCORES2.TXT : identifiant – note
SAS Livre Page 154 Jeudi, 18. septembre 2008 6:03 18
SAS Livre Page 155 Jeudi, 18. septembre 2008 6:03 18

5
Faciliter la gestion des tables SAS

Au sommaire de ce chapitre :
5.1. La procédure PROC CONTENTS
5.2. Les LABEL
5.3. L’attribution d’un FORMAT
5.4. La longueur de l’enregistrement des variables numériques
5.5. La gestion des tables
5.6. La gestion des options
Vous allez très vite avoir sur votre ordinateur de très nombreuses tables SAS construites il
y a plus ou moins longtemps. Vous pourrez avoir des difficultés à gérer concrètement vos
diverses tables. Voici quelques exemples de problèmes que vous risquez de rencontrer :
• Dans cette version de la table, est-ce que cette variable si importante est présente ?
• Le nom de variable SDRRF vous semblait, lorsque vous l’avez construite, parfaitement
en accord avec la signification concrète de cette variable mais vous l’avez oubliée.
• Cette variable peut prendre comme modalité 1, 2, 3 et 4. Chacune des modalités a
une signification concrète mais vous ne remettez plus la main sur la feuille de
papier qui vous sert de dictionnaire de variables.
• En raison d’un nombre de variables de plus en plus important, votre table prend
trop de place sur votre disque dur, ce qui rend sa manipulation très délicate, voire
impossible.
• Cette table existe sous de multiples formes, plus ou moins évoluées, et vous ne savez
plus quelles sont les versions temporaires de travail et quelle table doit être exploitée.
• Le programme que vous venez de soumettre n’était pas correct et son exécution
vous a fait perdre des informations importantes parce que la table créée avait le
même nom que la table de départ.
Si vous rencontrez ces problèmes, c’est que vous n’avez pas mis en place, au moment
de votre travail sur vos tables, les outils facilitant votre gestion des tables SAS. Atten-
tion, les outils qui sont présentés ici sont uniquement préventifs : ils ne permettent
pas de régler les problèmes que vous pourrez rencontrer. Nous conclurons ce chapitre sur
les outils dont vous disposez pour gérer vos options et modifier ainsi le fonctionnement
par défaut de votre système SAS.
SAS Livre Page 156 Jeudi, 18. septembre 2008 6:03 18

156 ◆ SAS

5.1 La procédure PROC CONTENTS


PROC CONTENTS vous permet de voir la structure d’une table SAS. Vous disposerez
ainsi d’un ensemble d’informations qui peuvent se révéler utiles pour vos traitements.
PROC CONTENTS DATA=test;
RUN;
Sur la table que nous avions en mémoire lors de la rédaction de cet ouvrage, la procé-
dure PROC CONTENTS donne ce résultat :
Résultat 5.1

Vous observez la présence de quatre types d’information regroupées en cadres. Les


cadres 2 et 4 sont les plus intéressants :
Dans le cadre 2, les informations indiquées sont :
• le nombre d’observations de la table (six dans le cas présent) ;
• le nombre de variables (six dans le cas présent) ;
• s’il existe des index associés à cette table (si vous demandez un index sur une
variable, SAS pourra accéder beaucoup plus rapidement aux données – voir l’aide
SAS pour plus de détails1 et à l’adresse suivante : support.sas.com/techsup/tech-
note/ts580.pdf) ;
• la longueur de chaque observation ;
• si des observations ont été supprimées (attention cette information ne peut appa-
raître que dans des conditions très précises – voir aide SAS) ;
• si cette table est compressée ;
• si elle est triée.

1. Voir SOMMAIRE / SAS Products / Base SAS / SAS 9.2 Language Reference Concepts / SAS Files Concepts
/ SAS Data Files / Understanding SAS indexes.
SAS Livre Page 157 Jeudi, 18. septembre 2008 6:03 18

Faciliter la gestion des tables SAS ◆ 157

Le cadre 3 présente des informations relatives à l’hôte (l’ordinateur) et au moteur


(votre version de SAS). Le cadre 1 vous donne des informations sur la date de création de
la table, sa dernière modification, etc.
Le cadre 4 donne des informations relatives aux variables présentes dans votre table.
Par défaut, les variables sont présentées dans l’ordre alphabétique. Pour chaque variable,
sont indiqués son ordre dans l’enregistrement (colonne ‘#’), son type (alphanu-
mérique ou numérique) et sa longueur.
Les options possibles de cette procédure sont les suivantes :
POSITION
Ajoute un classement des variables par position dans l’enregistrement.
PROC CONTENTS DATA=lib.test POSITION;RUN;
Cette option est utile lorsque l’on veut créer des blocs de variables avec « -- » (voir
section 3.9.4.).
SHORT
Pour obtenir uniquement une liste de variables.
NOPRINT
Pour que rien ne soit produit dans la fenêtre SORTIE. Cette option est utile si vous
demandez une table de sortie à PROC CONTENTS.
PROC CONTENTS DATA=lib.test OUT=lib.toto NOPRINT;RUN;
Dans cette table de sortie seront présentées les informations relatives à votre table.
Pour connaître la structure de l’ensemble des tables d’une bibliothèque donnée :
PROC CONTENTS DATA=lib._all_; RUN;
Si vous appliquez PROC CONTENTS afin d’obtenir des informations sur les tables
contenues dans une bibliothèque, vous pouvez introduire l’option NODS (ou
NODETAILS). Ceci vous permettra de produire uniquement la liste des tables
présentes dans cette bibliothèque et d’exclure les rapports complets tels qu’ils sont
présentés par le résultat 5.1.

5.2 Les LABEL


Parmi les fichiers support de cet ouvrage, vous trouverez une table TEST2. Si vous
réalisez un PROC CONTENTS sur cette table, vous obtiendrez :
Résultat 5.2
-----Alphabetic List of Variables and Attributes-----
# Variable Type Len Pos Label
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
1 X1 Num 8 0 département de naissance
2 X2 Num 8 8 code de la commune
3 X3 Num 8 16 nombre de versements
4 X4 Num 8 24 dernier versement
5 X5 Char 8 32 prénom
SAS Livre Page 158 Jeudi, 18. septembre 2008 6:03 18

158 ◆ SAS

Les LABEL permettent d’expliciter les variables dont les noms n’évoquent pas grand-
chose par eux-mêmes. Ces LABEL, à spécifier dans une étape DATA, réapparaîtront,
par exemple, dans vos tableaux croisés, ce qui vous épargnera de saisir des titres. La
programmation pour créer les LABEL présentée dans le résultat 5.2 est reprise dans le
programme 5.1.

Programme 5.1

DATA lib.test2;
SET lib.test2;
LABEL x1='Département de naissance'
x2='Code de la commune'
x3='Nombre de versements'
x4='Dernier versement'
x5='Prénom';
RUN;

Vous pourrez aussi passer par une commande ATTRIB pour attribuer à vos variables
un LABEL (la commande ATTRIB est examinée plus en détail dans la section 5.4.).
Exercice 5.1 : Retournons à l’exercice EXAMEN.TXT (voir section 3.5.2.). Nous
avions créé une table qui indiquait le nombre de personnes reçues, le pourcentage de
reçus, de mentions Très Bien, et par groupe de TD, le nombre de reçus et le
pourcentage de réussites. À coup sûr, cette table, examinée au moyen d’un PROC
PRINT, doit être peu lisible. Introduisez des LABEL pour rendre les résultats plus
explicites.
Vous remarquerez qu’à la suite de ce travail, si vous lancez un PROC PRINT, vous ne
verrez pas vos LABEL. Pour que ceux-ci apparaissent, vous pouvez lancer la
commande suivante :
PROC PRINT DATA=bilan LABEL;
RUN;
Vous pourrez ainsi obtenir un résultat semblable à celui-ci :
Résultat 5.3
nombre de nombre de nbre de nbre de nbre de nbre de
personnes mentions reçus, reçus, reçus, reçus,
Obs reçues très bien groupe n°1 groupe n°2 groupe n°3 groupe n°4
1 92 13 24 39 18 11
% de reçus, % de % de % de % de
tous groupes reçus, reçus, reçus, reçus,
Obs confondus groupe n°1 groupe n°2 groupe n°3 groupe n°4
1 0.29299 0.31579 0.30233 0.25 0.29730

Au cours d’une étape DATA, nous avons associé des LABEL aux variables. Vous
disposez aussi de l’instruction LABEL dans de très nombreuses procédures (voir le
programme 6.30 proposé dans la section 6.4.1., par exemple). Ces LABEL ne sont
alors utilisés que pour les sorties générées par la procédure au sein de laquelle vous les
avez saisis.
SAS Livre Page 159 Jeudi, 18. septembre 2008 6:03 18

Faciliter la gestion des tables SAS ◆ 159

5.3 L’attribution d’un FORMAT


Pour rendre plus lisibles vos données, vous pouvez attribuer des FORMAT à des
variables, de date par exemple (voir programmes 3.18 et 3.19). Ces FORMAT ne font
que modifier la manière d’afficher vos données, ils ne transforment pas vos modalités
à l’intérieur de vos tables. De très nombreux FORMAT sont livrés avec SAS. Vous avez
aussi la possibilité d’en créer de nouveaux vous-même en utilisant PROC FORMAT.
L’utilisation d’un FORMAT permet ainsi le regroupement de modalités sans création
d’une nouvelle variable.

5.3.1 L’utilisation de FORMAT prédéfinis sur des variables


numériques
Exercice 5.2 : À partir du fichier PRIX.TXT, créez une table SAS. Nous supposons
que la variable prix a été l’objet de calculs préalables compliqués (ce qui explique
pourquoi cette variable a 9 décimales).
Vous souhaitez, avant toute analyse, créer un simple tableau dans lequel vont appa-
raître les valeurs prises par votre variable prix.
PROC FREQ DATA=test;
TABLES prix;
RUN;
Nous reviendrons sur le principe de PROC FREQ dans la section 6.6. Si vous exécutez
ce programme, un tableau d’environ 200 pages va être créé dans votre fenêtre
SORTIE. Ce résultat est illisible et parfaitement inutile. Il peut être plus judicieux de
simplement présenter les prix en s’arrêtant à la première décimale. On peut, pour
cela, créer lors d’une étape DATA une nouvelle variable arrondie de la variable prix
grâce à la fonction ROUND. Il s’agit là d’une solution certes possible mais qui va
alourdir votre table et vous prendre du temps. S’il s’agit uniquement de pouvoir
visualiser la distribution des modalités de votre variable, vous pourrez alternative-
ment attribuer à cette variable numérique un FORMAT qui ne sera employé qu’à la
lecture (mais pas pour les calculs) :

Programme 5.2

DATA test;
SET test;
FORMAT prix 4.1;
RUN;

Nous demandons à SAS de présenter la variable numérique prix en utilisant 4 carac-


tères et un chiffre au plus après la virgule. Si, ensuite, vous souhaitez un affichage avec
4 décimales :
Programme 5.3

DATA test;
SET test;
FORMAT prix 7.4;
RUN;
SAS Livre Page 160 Jeudi, 18. septembre 2008 6:03 18

160 ◆ SAS

Les prix s’afficheront avec quatre décimales mais les décimales non affichées ne
seront pas perdues. L’utilisation de FORMAT nécessite cependant quelques précau-
tions. Il est impératif de spécifier correctement le nombre de caractères à utiliser pour
représenter la variable. Si ce nombre de caractères devait être trop faible, votre affi-
chage pourrait être sans rapport avec vos vraies données. Si SAS ne parvient pas à
présenter toutes les modalités de votre variable avec le FORMAT que vous lui avez
indiqué, votre fenêtre JOURNAL affichera le message suivant :
NOTE: Au moins un format W.D est trop petit pour que les chiffres soient
imprimés. La partie décimale peut être décalée par le format "BEST.
Ce message doit être compris comme une invitation à modifier votre FORMAT. Vous
avez toujours la possibilité de demander le FORMAT BESTw. Dans ce cas, SAS choi-
sira la meilleure notation en fonction de la nature de vos modalités1.
Ainsi, un FORMAT 4.2 ne peut afficher correctement que des modalités strictement
supérieures à -1 (exemple : –.99) et strictement inférieures à 10 (9.99). Vous avez déjà
besoin de trois caractères pour afficher deux décimales (n’oubliez pas le point, sépa-
ration décimale), il ne vous reste qu’un caractère pour afficher soit le signe moins,
soit l’unité. Si votre FORMAT est correctement choisi, celui-ci présentera les données
comme si vous aviez demandé un arrondi.

Programme 5.4

DATA test;
INPUT x @@;
CARDS;
1101 1101.1 1101.2 1101.3 1101.4 1101.5 1101.6 1101.7 1101.8
1101.9 1102
;
PROC PRINT DATA=test;
FORMAT x 4.0;
RUN;

Résultat 5.4
Obs x
1 1101
2 1101
3 1101
4 1101
5 1101
6 1102
7 1102
8 1102
9 1102
10 1102
11 1102

Vous pouvez aussi souhaiter utiliser un FORMAT pour une procédure donnée sans
pour autant l’introduire dans la table. Votre instruction FORMAT devra alors prendre
place au sein même de votre procédure :

1. Pour comprendre la manière dont SAS procède pour déterminer la meilleure présentation possible de
vos données, voir l’aide SAS, entrée BESTw. Format.
SAS Livre Page 161 Jeudi, 18. septembre 2008 6:03 18

Faciliter la gestion des tables SAS ◆ 161

Programme 5.5

PROC FREQ DATA=test;


TABLES x;
FORMAT x 7.4;
RUN;

5.3.2 FORMAT ou INFORMAT ?


Il est nécessaire que vous saisissiez les différences importantes qui peuvent exister
entre les FORMAT et les INFORMAT : même si les termes appelant les FORMAT et
les INFORMAT peuvent apparaître semblables, FORMAT et INFORMAT sont deux
concepts différents.
Exemple 8.4 :
• Si 8.4 est un FORMAT, alors vous demandez que la modalité soit représentée au
moyen de 8 caractères et 4 chiffres après la virgule1.
• Si 8.4 est un INFORMAT, alors vous demandez de lire dans le fichier brut 8 carac-
tères pour la variable et de multiplier le résultat obtenu par 10-4, si la modalité ne
contient pas de séparateur décimal.
Les choses peuvent cependant devenir compliquées si vous imposez des FORMAT
lors de la phase de création de votre table comme le montre le programme 5.6.
Programme 5.6

DATA test;
FORMAT Y 10.3
X $char3.;
Y=123.4567;
X="bonjour";
PUT X/Y;
RUN;

L’instruction PUT demande ici d’écrire dans la fenêtre JOURNAL ce que SAS a dans
la table pour X et Y. Vous obtenez alors :
bon
123.457

Si vous demandez maintenant un PROC PRINT :


Résultat 5.5
Obs Y X
1 123.457 bon
PROC PRINT DATA=test;
FORMAT _all_;
RUN;
Obs Y X
1 123.457 bon

1. 8.4 conviendra pour une variable numérique dont les valeurs sont strictement supérieures à –100 et
strictement inférieures à 1000.
SAS Livre Page 162 Jeudi, 18. septembre 2008 6:03 18

162 ◆ SAS

L’instruction FORMAT _ALL_ vous épargne d’utiliser les FORMAT pour la sortie
ordonnée par PROC PRINT. Vous remarquerez que la modalité de Y est corrompue
définitivement. La modalité est affectée par la demande d’un FORMAT. La même
chose se passe pour la variable alphanumérique X : le FORMAT demandé ici semble
avoir agi comme un INFORMAT modifiant la lecture de la donnée brute. Si mainte-
nant vous relancez le programme en plaçant l’instruction FORMAT juste avant
l’instruction PUT, vous n’aurez aucune difficulté.
Il vous est donc recommandé de procéder dans l’ordre suivant :
1. Créez votre table et utilisez à ce moment les INFORMAT.
2. Une fois votre table créée, imposez des FORMAT si vous le souhaitez.

5.3.3 Quelques FORMAT utiles sur variables numériques


Donnée FORMAT FORMAT
SAS (forme générale) appliqué Affichage
23451.23 COMMAw.d COMMA10.2 23,451.23
23451.23 COMMAXw.d COMMAX10.2 23.421,23
23451.23 DOLLARw.d DOLLAR10.2 $23,421.23
23451.23 DOLLARXw.d DOLLARX10.2 $23.421,23
23451.23 NLNUMw.d NLNUM9.2 23 421,23
23451.23 EUROw.d EURO10.2 €23,451.23
23451.23 EUROXw.d EUROX10.2 €23.451,23
23451.23 Ew. E10. 2.345E+04
E12. 2.34512E+04
0.666666666 FRACTw. FRACT. 2/3
0.1 PERCENTw.d PERCENT10. 10%
2004 ROMANw. ROMAN10. MMIV
0.11111111 WORDSw. WORDS25. zero and eleven hundredths
1.50 WORDFw. WORDF30. one and 50/100

Une liste plus complète des FORMAT possibles sur variables numériques pourra être
trouvée dans votre documentation SAS1 ou dans l’aide en ligne :
(SAS 9.1.3) : support.sas.com/onlinedoc/913/getDoc/fr/lrdict.hlp/a001263753.htm
(SAS 9.2) : support.sas.com/documentation/cdl/en/lrdict/59540/HTML/default/
a001263753.htm
À noter depuis la version 9.1 de SAS un ensemble de nouveaux FORMAT monétaires :

NLMNLAUD Australian Dollars NLMNLHKD Hong Kong Dollars NLMNLPLN Polish Zlotych
NLMNLCAD Canadian Dollars NLMNLILS Israeli New Shekels NLMNLRUR Russian Rubles
NLMNLCHF Swiss Francs NLMNLJPY Japanese Yen NLMNLSEK Swedish Kronor

1. Entrée Formats, puis by category.


SAS Livre Page 163 Jeudi, 18. septembre 2008 6:03 18

Faciliter la gestion des tables SAS ◆ 163

NLMNLCNY Chinese Yuan NLMNLKRW Korean Won NLMNLSGD Singapore Dollars


Renminbi
NLMNLDKK Danish Kroner NLMNLMYR Malaysian Ringgits NLMNLTWD Taiwan New Dollars
NLMNLEUR Euros NLMNLNOK Norwegian Kroner NLMNLUSD US Dollars
NLMNLGBP British Pounds NLMNLNZD New Zealand Dollars NLMNLZAR South African Rand

Exemple : 1000,00 NLMNLAUD15.2  AU$1000.00


Il s’agit ici d’une notation nationale des sommes en dollars autraliens. Pour une nota-
tion internationale (AUD1000.00), les FORMAT débuteront non pas par NLMNL
mais par NLMNI.
Dans SAS 9.2, des FORMAT qui permettent la conversion de monnaies ont été introduits.
Exemple :
EURFRFRFw.d
pour convertir en euros des sommes en francs.
EURTOFRFw.d
pour convertir en francs des sommes en euros.
Pour plus de détails sur ces nouveaux FORMAT, vous pouvez consulter l’aide SAS,
entrée European Currency Conversion.

5.3.4 Les FORMAT d’affichage des variables de date


Nous avons déjà précisé que les dates sont enregistrées dans les tables SAS comme un
nombre de jours qui séparent la date en question du 1er janvier 1960. À l’affichage,
vous pouvez cependant souhaiter voir, non pas un nombre de jours, mais bien une
date. Vous appliquerez donc un FORMAT à votre date. Ainsi :

Programme 5.7

DATA date4; ** résultat du DATA date4;


INPUT date fradfde.; PROC PRINT; SET date4;
CARDS; FORMAT date fradfde.;
01JAN60 Obs date RUN;
01FEV60 ** résultat du PROC PRINT;
01MAR60 1 0 Obs date
01AVR60 2 31
01MAI60 3 60 1 01jan60
01JUN60 4 91 2 01fev60
01JUL60 5 121 3 01mar60
4 01avr60
01AOU60 6 152
5 01mai60
01SEP60 7 182 6 01jun60
01OCT60 8 213 7 01jul60
01NOV60 9 244 8 01aou60
01DEC60 10 274 9 01sep60
;RUN; 11 305 10 01oct60
12 335 11 01nov60
12 01dec60
SAS Livre Page 164 Jeudi, 18. septembre 2008 6:03 18

164 ◆ SAS

Il existe de très nombreux FORMAT de date. La date du 1er octobre 2007 (en fait,
17740) peut ainsi être affichée de différentes manières :

FORMAT FORMAT
(forme générale) appliqué Exemple INTERNATIONAL/FRANÇAIS
DATEw. DATE7. 01OCT07 EURDFDE./FRADFDE.
DATE9. 01OCT2007 EURDFDD./FRADFDD.
DDMMYYw.a DDMMYY6. 011007
DDMMYY8. 01/10/07
DDMMYY10. 01/10/2007
DOWNAMEw. DOWNAME. Monday EURDFDWN./FRADFDWN.
DOWNAME3. Mon
JULDAYw. JULDAY 274
JULIANw. JULIAN. 07274
JULIAN7. 2007274
MMDDYYw. MMDDYY6. 100107
MMDDYY8. 10/01/07
MMDDYY10. 10/01/2007
MMYYxw. MMYYS5. 10/07
MMYYS7 10/2007
MONNAMEw. MONNAME. October EURDFMN./FRADFMN.
MONNAME3. Oct
MONTHw. MONTH. 10
MONYYw. MONYY. Oct07 EURDFMY./FRADFMY.
MONYY7. Oct2007 FRADFMY7.
QTRw. QTR. 4
QTRRw. QTRR. IV
WEEKDATEw. WEEKDATE9. Monday
WEEKDATE15. Mon, Oct 1, 07
WEEKDATE. Monday,
October 1, 2007
WEEKDATE29. Monday,
October 1, 2007
WEEKDATXw. WEEKDATX9. Monday EURDFWKX./FRADFWKX8.
WEEKDATX15. Mon, 1 oct 07 FRADFWKX15.
WEEKDATX. Monday, 1 FRADFWKX.
October 2007
WEEKDATX29. Monday, 1 FRADFWKX27.
October 2007
WEEKDAYw. WEEKDAY. 2 EURDFDN./FRADFDN.
SAS Livre Page 165 Jeudi, 18. septembre 2008 6:03 18

Faciliter la gestion des tables SAS ◆ 165

FORMAT FORMAT
(forme générale) appliqué Exemple INTERNATIONAL/FRANÇAIS
WORDATEw. WORDATE3. Oct
WORDATE9. October
WORDATE12. Oct 1, 2007
WORDATE. October 1, 2007
WORDATE18. October 1, 2007
WORDATXw. WORDATX3. Oct EURDFWDX./FRADFWDX3.
WORDATX9. October FRADFWDX9.
WORDATX12. 1 Oct 2007 FRADFWDX12.
WORDATX. 1 October 2007 FRADFWDX.
WORDATEX. 1 October 2007
YEARw. YYYY. 2007
YYYY2. 07
YYMMxw. YYMMS. 2007/10
YYMMDDw. YYMMDD6. 071001
YYMMDD. 07-10-01
YYMMDD10. 2007-10-01
YYMONw. YYMON. 2007OCT
YYQxw. YYQS. 2007/4
a. De plus, certains FORMAT peuvent être déclinés. Par exemple : DDMMYYC. (01:10:07) DDMMYYD.
(01-10-07), DDMMYYP. (01.10.07) et DDMMYYS. (01/10/07).

Vous remarquez que les FORMAT qui offrent une présentation des dates contenant
des mots disposent de versions internationales (et donc françaises). Pour utiliser les
versions internationales de ces FORMAT (EURDFxx), il faut modifier la valeur de
DFLANG (langue par défaut).
Programme 5.8

OPTIONS DFLANG=french;
PROC PRINT;
FORMAT date eurdfwdx.;
RUN;

Vous obtiendrez :
Résultat 5.6
Obs JJ MM AA date
1 1 1 1960 1er janvier 1960
2 1 1 1900 1er janvier 1900
3 10 10 1980 10 octobre 1980
4 20 12 2003 20 décembre 2003
SAS Livre Page 166 Jeudi, 18. septembre 2008 6:03 18

166 ◆ SAS

Sans modifier la langue par défaut, vous pouvez aussi utiliser les FORMAT interna-
tionaux en remplaçant le préfixe EUR par le préfixe correspondant à votre langue1.
Langues disponibles dans SAS 9.1 :

Danish DAN Dutch NLD Finnish FIN


French FRA German DEU Italian ITA
Norwegian NOR Portuguese PTG Spanish ESP
Swedish SVE Swiss_French FRS Swiss_German DES

De nouvelles langues ont été introduites avec SAS 9.2. Il s’agit de :

Afrikaans AFR Catalan CAT Croatian CRO


Czech CSY Hungarian HUN Macedonian MAC
Polish POL Russian RUS Slovenian SLO

Programme 5.9

PROC PRINT;
FORMAT date ptgdfwdx.;
RUN;

Résultat 5.7
Obs JJ MM AA date
1 1 1 1960 1 de janeiro de 1960
2 1 1 1900 1 de janeiro de 1900
3 10 10 1980 10 de outubro de 1980
4 20 12 2003 20 de dezembro de 2003

Exercice 5.3 : Dans la table SAS nommée DATETIME, est présente une variable date
à laquelle on a appliqué un FORMAT DATETIME20. : les dates apparaissent sous la
forme 28APR2005:02:43:34. (C’est par exemple sous ce FORMAT qu’apparaissent
les dates lorsque vous importez une table en provenance d’ACCESS.)
Appliquez à cette date le FORMAT DDMMYY8. (C’est bien moins facile qu’il n’y
paraît et vous en conclurez qu’il ne faut jamais faire confiance à ce que l’on voit d’une
table SAS lorsque des FORMAT ont été appliqués…)

5.3.5 Les FORMAT d’affichage des variables alphanumériques


Les FORMAT d’affichage des variables alphanumériques les plus courants sont
$CHARw. et $w.
FORMAT alpha $char8.;
FORMAT alpha $10.;

1. Ces FORMAT nationaux ont des caractéristiques en terme de nombre de caractères à utiliser qui sont
propres à chaque langue. Pour plus de détails, voir dans l’aide SAS, entrée International Date and
Datetime Formats.
SAS Livre Page 167 Jeudi, 18. septembre 2008 6:03 18

Faciliter la gestion des tables SAS ◆ 167

Il n’apparaît pas de différences entre ces deux FORMAT. D’autres FORMAT existent
et peuvent ainsi transformer toutes vos minuscules en majuscules, ou inverser l’ordre
des lettres : BOURVIL  LIVRUOB. Pour plus de détails, consultez l’aide SAS
(entrée Formats, puis, dans l’arborescence, by category) ou les liens vers l’aide en
ligne cités dans la section 5.3.3.

5.3.6 La création de FORMAT spécifiques


À ce stade, vous avez dû comprendre que les FORMAT permettent d’afficher les
modalités prises par une variable de manière lisible. Si certains FORMAT sont propo-
sés par SAS, il est aussi possible de créer ses propres FORMAT au moyen de la procé-
dure PROC FORMAT (déjà évoquée pour créer des INFORMAT spécifiques – voir
section 2.8.4.). Consultez à nouveau cette section, et plus particulièrement l’ensemble
des règles existantes, pour plus de détails sur le nom des FORMAT, la spécification
des intervalles, etc.

a. PROC FORMAT
Nous travaillerons pour cette section sur le fichier VILLES.TXT. Dans ce fichier, vous
trouverez une liste de villes de la région Centre, le département (45, 28, 36) dans
lequel ses villes se situent, un code indiquant si la ville est préfecture (1), sous-préfec-
ture (2) ou chef lieu de canton (3) et un deuxième code indiquant en trois lettres le
département (loi, eur, ind).
Exercice 5.4 : Créez une table SAS au moyen de ce fichier (variables à créer : VILLE,
DEP, CODE, et CODE2).
Un PROC PRINT vous donne un résultat peu clair que l’on va rendre plus lisible au
moyen de FORMAT spécifiques appropriés grâce au programme 5.10.

Programme 5.10

PROC FORMAT;
VALUE fdepart
45='Loiret'
28='Eure et Loir'
36='Indre';
VALUE fcode
1='Préfecture'
2='sous préfecture'
3='chef lieu de canton';
VALUE $fcodeb
'loi'='Loiret'
'eur'='Eure et Loir'
'ind'='Indre';
RUN;

DATA villes;
SET villes;
FORMAT dep fdepart.
code fcode.
code2 $fcodeb.;
RUN;
SAS Livre Page 168 Jeudi, 18. septembre 2008 6:03 18

168 ◆ SAS

Si maintenant, vous ordonnez un PROC PRINT, vous verrez que votre table est devenue
plus lisible. Quelques petits détails à savoir :
• Un FORMAT peut prendre n’importe quel nom mais ne doit pas se terminer ni
commencer par un chiffre.
• Si vous créez un FORMAT que vous destinez à une variable alphanumérique, il
faut mettre un $ au début du nom du FORMAT, dans la phase de définition et
dans la phase d’attribution. Le FORMAT FCODE va être appliqué à une variable
numérique1.
• À l’intérieur de PROC FORMAT, votre FORMAT ne doit pas se terminer par un
point.
• Dans la phase d’attribution de votre FORMAT à une variable, le nom de votre
FORMAT doit se terminer par un point.

b. Assigner des FORMAT spécifiques de façon permanente à une table


Est-ce que les FORMAT créés sont associés de façon permanente à vos variables ?
Non, pas dans le cas présent. Il faut que vous demandiez à SAS d’enregistrer les
FORMAT en ajoutant à votre commande PROC FORMAT l’option LIBRARY= :
LIBNAME malib 'C:\intro_SAS';
PROC FORMAT LIBRARY=malib;
+ lignes de commande;
RUN;
MALIB est la bibliothèque créée au moyen d’une commande LIBNAME. En spéci-
fiant LIBRARY=MALIB, SAS crée un fichier FORMAT que l’on pourra appeler et
compléter lors d’une utilisation ultérieure2. Vous remarquez que, pour l’instant, la
table VILLES est temporaire. Pour créer une table permanente :
DATA malib.villes;
SET villes;
RUN;
À ce stade, si vous quittez SAS pour ensuite débuter une nouvelle session et si vous
réalisez un PROC PRINT, vos FORMAT ne seront pas connus et votre table refusera
de s’ouvrir – dans la fenêtre JOURNAL, vous aurez ce message :
Résultat 5.8
2 PROC PRINT DATA=malib.villes;RUN;
ERROR: Format FDEPART not found or couldn’t be loaded for variable departement.
ERROR: Format FCODE not found or couldn’t be loaded for variable code.
ERROR: Format $FCODEB not found or couldn’t be loaded for variable code2.
NOTE: The SAS System stopped processing this step because of errors.
NOTE: PROCEDURE PRINT used:
real time 0.03 seconds
cpu time 0.03 seconds

1. Rappel : Un INFORMAT est caractère lorsqu’il transforme une donnée en une chaîne de caractères ; il
est numérique s’il transforme la donnée brute en donnée numérique – la forme de la donnée brute ne
compte pas. Un FORMAT est numérique lorsqu’il est appliqué à une variable numérique, et caractère
lorsqu’il est appliqué à une variable alphanumérique.
2. Si, à un emplacement physique, existe une table de FORMAT, la définition de nouveaux FORMAT
enregistrés dans la même bibliothèque lors d’une nouvelle session SAS ne détruit pas le fichier
FORMAT déjà existant mais le complète.
SAS Livre Page 169 Jeudi, 18. septembre 2008 6:03 18

Faciliter la gestion des tables SAS ◆ 169

Où sont vos FORMAT ? Vous devez dire à SAS l’endroit où il doit rechercher les
FORMAT spécifiques au moyen de la commande :
OPTIONS FMTSEARCH=(malib.formats);
Vos FORMAT seront de nouveau disponibles et utilisables lorsque vous réaliserez
votre PROC PRINT. Vous pouvez simplement indiquer la bibliothèque dans laquelle
se trouvent vos FORMAT, voire indiquer plusieurs librairies :
OPTIONS FMTSEARCH=(malib work);
Si vous appelez votre bibliothèque LIBRARY, plutôt que de lui attribuer un nom quel-
conque (ici MALIB), vous n’aurez pas besoin de la ligne d’OPTIONS : SAS ira de lui-
même chercher les FORMAT dont il a besoin. En effet, SAS recherche par défaut un
fichier de FORMAT dans la bibliothèque LIBRARY et dans la bibliothèque WORK. S’il
ne trouve pas ce fichier, il vous envoie un message d’erreur du type présenté par le résul-
tat 5.8. Si, vous souhaitez que SAS exécute le programme que vous lui soumettez même
s’il ne trouve pas les FORMAT que vous aviez pourtant pris la peine de sauvegarder
quelque part, vous pouvez entrer la ligne d’OPTIONS suivante :
OPTIONS NOFMTERR;
Cette option demande à ce qu’il n’y ait pas de message d’erreur et de refus de traite-
ment en cas d’absence de FORMAT. Cette option vous sera particulièrement utile si
un de vos correspondants vous transmet une table dans laquelle il a introduit des
FORMAT spécifiques sans vous transmettre ces derniers. Il aurait dû envoyer à la fois
sa table et le fichier dans lequel sont stockées les définitions des FORMAT spécifiques
FORMAT.SAS7BCAT (à rechercher sur votre disque dur, à l’endroit physique qui
correspond à votre bibliothèque).
Si vous créez un INFORMAT au moyen de PROC FORMAT et que vous souhaitiez
l’enregistrer pour une utilisation ultérieure, la démarche est identique à celle exposée
ici : vous devez enregistrer votre INFORMAT en utilisant l’option LIBRARY= et,
pour pouvoir utiliser votre INFORMAT, indiquer la bibliothèque dans laquelle vous
avez sauvegardé votre INFORMAT via l’option FMTSEARCH.

c. Utiliser des FORMAT spécifiques dans des sorties sans que ceux-ci
soient dans la table SAS
Vous pouvez souhaiter que vos FORMAT spécifiques ne soient pas dans votre table
SAS et qu’ils soient uniquement présents lorsque vous utilisez telle ou telle procédure
(un PROC PRINT, par exemple). Nous devons déjà retirer les FORMAT de la table :

Programme 5.111

DATA malib.villes;
SET malib.villes;
FORMAT dep code code2;
RUN;

Si vous réalisez un PROC PRINT sur votre table, les FORMAT ont bien disparu.
Maintenant, dans la procédure demandant une sortie, il demeure possible d’utiliser
les FORMAT spécifiques :

1. FORMAT _ALL_ est tout aussi possible dans ce programme.


SAS Livre Page 170 Jeudi, 18. septembre 2008 6:03 18

170 ◆ SAS

Programme 5.12

PROC PRINT DATA=malib.villes;


FORMAT dep fdepart. code fcode. code2 $fcodeb.;
RUN;

Une fois de plus, si vous quittez SAS et que vous entriez à nouveau, même si vous
définissez votre bibliothèque au moyen d’un LIBNAME et si vous ordonnez ce
PROC PRINT, les FORMAT spécifiques n’apparaîtront pas. Vous devrez là encore
passer par :
OPTIONS FMTSEARCH=(malib);

d. Créer plusieurs FORMAT spécifiques pour une même variable


Cette procédure n’a de sens que dans une commande de sortie : dans une table SAS,
vous ne pouvez attribuer qu’un FORMAT par variable. Nous créons un second
FORMAT pour la variable département :
Programme 5.13

PROC FORMAT;
VALUE floiret 45='loiret' OTHER='non Loiret';
RUN;

Ici, les anciens FORMAT spécifiques ne sont pas écrasés par la commande. Le
nouveau FORMAT est ajouté à la liste de FORMAT déjà existants dans la table
MALIB.FORMAT.
Programme 5.14

PROC PRINT DATA=malib.villes;


FORMAT dep floiret. code fcode. code2 $fcodeb.;
RUN;

PROC PRINT DATA=malib.villes;


FORMAT dep fdepart. code fcode. code2 $fcodeb.;
RUN;

Et vous obtiendrez le résultat escompté. Au bout d’un moment, il est possible que
vous ne sachiez plus très bien ce que vos FORMAT spécifiques signifient concrète-
ment. Si vous avez perdu le programme qui a construit ces FORMAT, vous pouvez
toujours connaître leurs structures au moyen de l’option FMTLIB.
Programme 5.15

PROC FORMAT LIBRARY=malib.formats FMTLIB;


RUN;

e. Les FORMAT entrelacés


La procédure PROC FORMAT est bien plus puissante qu’il n’y paraît. Un dernier exem-
ple pour vous convaincre. Nous travaillerons ici sur le fichier FMTCOMPET.TXT. Dans
ce fichier, on dispose de trois variables : un identifiant individuel, le revenu de la
SAS Livre Page 171 Jeudi, 18. septembre 2008 6:03 18

Faciliter la gestion des tables SAS ◆ 171

personne pour l’année 2007 et l’âge de la personne. Le programme 5.16 crée la table
SAS, puis un FORMAT entrelacé grâce à l’option MULTILABEL :
Programme 5.16

DATA fmt;
INFILE 'C:\intro_SAS\fichiers\fmtcompet.txt';
INPUT ident revenu age;
RUN;
PROC FORMAT;
VALUE age(MULTILABEL)
low-19 = '19 et -'
20-29 = '20-29'
30-39 = '30-39'
40-49 = '40-49'
50-59 = '50-59'
60-high = '60 et +'
20-35 = '20-35'
36-55 = '36-55'
55-high = '55 et +';
RUN;

Afin de connaître le revenu moyen pour chaque classe d’âges, vous allez utiliser la
procédure PROC MEANS (voir section 6.2.).
Programme 5.17

PROC MEANS DATA=fmt;


VAR revenu;
CLASS age/MLF;
FORMAT age age.;
RUN;

La variable à analyser (instruction VAR) est le revenu. L’instruction CLASS permet


l’analyse par classes d’âges. L’option MLF indique que le FORMAT qui s’applique à la
variable AGE est un FORMAT entrelacé. Lors de la procédure PROC MEANS, nous
associons la variable AGE au FORMAT AGE. Nous obtenons ainsi :
Résultat 5.9
N
age Obs N Mean Std Dev Minimum Maximum
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
19 et - 56 56 9458.11 6540.98 2013.00 23152.00
20-29 229 229 8299.69 5675.63 2016.00 26889.00
20-35 308 308 8235.31 5574.86 2016.00 26889.00
30-39 122 122 7992.65 5344.39 2005.00 23461.00
36-55 153 153 8003.22 5371.25 2001.00 22457.00
40-49 83 83 8007.52 5017.68 2001.00 22457.00
50-59 47 47 9523.60 6786.57 2002.00 24534.00
55 et + 75 75 9156.59 5598.39 2002.00 24534.00
60 et + 52 52 8412.37 4769.21 2296.00 22093.00
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ

Sans FORMAT assigné à la variable de classification AGE, vous auriez eu quatre


statistiques calculées pour chaque modalité de AGE. Vous constatez donc que les
FORMAT, au-delà d’une simple représentation des modalités sous une forme plus
SAS Livre Page 172 Jeudi, 18. septembre 2008 6:03 18

172 ◆ SAS

lisible, peuvent aussi être utilisés pour des analyses en provoquant des regroupements
de modalités.

5.3.7 Une seconde utilisation de PUT


Parmi les commandes de SAS, il existe la commande PUT que vous verrez
souvent dans des exemples de programmation parce qu’elle permet, dans sa
première version, d’envoyer un résultat dans la fenêtre JOURNAL. Ainsi, le
programme 5.18 permet l’affichage de la date correspondant à 17654 dans le
FORMAT date7.

Programme 5.18

DATA test;
date=17654;
PUT date date7.;
RUN;

SAS vous propose aussi une fonction PUT qui permet de créer une variable alphanu-
mérique en donnant à la nouvelle variable les modalités d’une autre variable à
laquelle on applique un certain FORMAT. Cette fonction PUT ne doit pas être
confondue avec la fonction INPUT traitée dans la section 3.4.1. Nous reprenons la
table FMT créée par le programme 5.16.

Programme 5.19

DATA fmt;
SET fmt;
revenu_2=PUT(revenu,eurox12.2);
revenu_3=INPUT(revenu_2,eurox12.2);
RUN;

La fonction PUT utilisée dans le programme 5.19 permet de créer une variable alpha-
numérique REVENU_2 qui a pour modalité REVENU à laquelle on a appliqué le
FORMAT EUROX12.21. La fonction INPUT crée une variable numérique en ordon-
nant la lecture des modalités de REVENU_2 au moyen de l’INFORMAT EUROX12.2.
La nature de la variable créée par la fonction INPUT est différente selon la nature
de l’INFORMAT utilisé. La fonction PUT ne peut créer que des variables alphanu-
mériques.
Cette fonction PUT vous est particulièrement utile lorsque vous avez créé votre
propre FORMAT. Seuls les FORMAT non entrelacés peuvent être utilisés ici.
Exemple : Nous avons créé un FORMAT appelé AGEB non entrelacé (- de 19, 20-29,
30-39, 40-49, 50-59 et + de 60).
Exercice 5.5 : Écrivez le programme qui permet de créer ce FORMAT AGEB.
Nous souhaitons maintenant créer une variable qui reprenne ce FORMAT sous
forme de modalités. Un utilisateur peu expérimenté procédera de cette manière :

1. Le FORMAT EUROX12.2 (sans point à la fin) est bien le FORMAT appliqué.


SAS Livre Page 173 Jeudi, 18. septembre 2008 6:03 18

Faciliter la gestion des tables SAS ◆ 173

Programme 5.20

DATA fmt;
SET fmt;
IF age<20 THEN ager='19 et -';
IF 19<age<30 THEN ager='20-29';
IF 29<age<40 THEN ager='30-39';
IF 39<age<50 THEN ager='40-49';
IF 49<age<60 THEN ager='50-59';
IF age>59 THEN ager='60 et +';
RUN;

Cette longue liste de commandes est avantageusement remplacée par :


Programme 5.21

DATA fmt;
SET fmt;
ager=PUT(age,ageb.);
RUN;

5.4 La longueur de l’enregistrement des variables


numériques
Lorsque vous réalisez un PROC CONTENTS sur une table SAS, parmi les informa-
tions qui vous sont offertes, on vous donne le LENGTH (la longueur) de la variable,
c’est-à-dire, pour les variables numériques, le nombre d’octets attribués à cette varia-
ble dans la table SAS. Il peut être utile de modifier cette longueur principalement
pour économiser de la place sur votre disque dur. Attention : il s’agit là d’une procé-
dure très dangereuse si vous ne comprenez pas très exactement ce que vous faites.
Si les modalités de votre variable sont décimales, ne tentez aucune modification.
En revanche, s’il s’agit d’entiers, il est possible d’imposer une longueur d’enregistre-
ment comprise entre 3 et 8 pour réduire la taille de votre table SAS. Cela n’est intéres-
sant que si vous avez une table de plusieurs dizaines, voire plusieurs centaines de
mégaoctets.

LENGTH Max. VALUE LENGTH Max. VALUE


3 8 192 6 137 438 953 472
4 2 097 152 7 35 184 372 088 832
5 536 870 912 8 9 007 199 254 740 990

Pour chaque longueur d’enregistrement, vous disposez dans le tableau ci-dessus de la


valeur entière maximale que pourra prendre votre variable1 (le signe est géré en

1. Ces valeurs maximales dépendent de votre système d’exploitation. Ici, ce sont les valeurs maximales
possibles avec Windows, Unix, OS/2, OpenVMS Alpha. Sur CMS, VAX et OS/390, les LENGTH peu-
vent varier de 2 à 8 : les entiers maximaux possibles en fonction du nombre d’octets alloués (K) sont
égaux à 2(K-1)*8. Sous Windows, c’est 2(8K-11).
SAS Livre Page 174 Jeudi, 18. septembre 2008 6:03 18

174 ◆ SAS

interne par SAS indépendamment de la longueur de l’enregistrement). Par exemple,


un LENGTH à 3 est particulièrement recommandé pour des variables indicatrices ou
pour des variables prenant peu de valeurs. S’il vous est possible de modifier la
longueur d’enregistrement d’une variable numérique au moyen de la commande
LENGTH, vous ne pouvez pas modifier la longueur attribuée à une variable alphanu-
mérique (voir section 3.1.2.).

Programme 5.22

DATA test;
INPUT X XB;
CARDS;
1 6.17856
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
;RUN;

DATA test;
SET test;
LENGTH X Xb 3;
RUN;

Votre table devient :


Résultat 5.10
Obs X XB
1 1 6.1777
2 2 2.0000
3 3 3.0000
4 4 4.0000
5 5 5.0000
6 6 6.0000
7 7 7.0000
8 8 8.0000
9 9 9.0000
10 10 10.0000

L’attribution d’une longueur de 3 à la variable XB nous a conduits à un résultat erroné


que nous ne pourrons plus corriger par la suite. Une nouvelle fois : ne modifiez rien si
vos modalités contiennent des décimales !
Exercice 5.6 : Cré