Posts Tagged ‘dataset’

h1

Aller-Retour entre dataset et catalogue de formats avec CNTLIN en CNTLOUT

décembre 29, 2012

Dans un précédent article, je parlais des deux méthodes pour créer des formats avec une procédure proc format, la première étant de taper toutes les values dans une instruction value, la seconde étant de stocker ces valeurs dans un data set et de les convertir en format avec l’option cntlin. Aujourd’hui, je souhaite revenir sur l’option CNTLIN et son pendant CNTLOUT pour passer d’un dataset à un format et pour passer d’un format à un dataset.

1. Créer une table SAS (dataset) type

Pour débuter créons un data set (table SAS) appelée POP avec 4 colonnes START, LABEL, TYPE et FMTNAME. Cette table contient les données pour deux formats : un format numérique et un format alphanumérique. Ces deux formats sont appelés GRP.

data pop;
length start $40 label $200 type $1 fmtname $32;
retain fmtane 'GRP' type 'N';
start='10';
label='Per Protocol';
output;
start='11';
label='Modified Per Protocol';
output;
start='20';
label='Intent-to-Treat';
output;
start='21';
label='Modified Intent-to-Treat';
output;
type='C';
start='PP';
label='Per Protocol';
output;
start='mPP';
label='Modified Per Protocol';
output;
start='ITT';
label='Intent-to-Treat';
output;
start='mITT';
label='Modified Intent-to-Treat';
output;
run;

S’il est possible de convertir de convertir le nombre 100 stocker dans une variable alphanumérique en numérique, il est impossible de convertir le mot ABC en numérique. Dans cet exemple on comprend mieux pour quoi START est toujours alphanumérique qu’il s’agisse dun format numérique ou alphanumérique.

2. Passer d’un dataset à un format catalog

A présent la procédure proc format convertit le data set en format catalogue. Le data set est situé dans la bibliothèque (library) WORK. Il n’y a pas besoin de préciser la bibliothèque de la table POP. Par défaut le format catalog s’appellera FORMATS et sera stocké dans la bibliothèque WORK. L’option LIB n’est pas utilisé.

proc format cntlin=pop;
run;

Ainsi le code au dessus est équivalent à :

proc format cntlin=work.pop lib=work.formats;
run;

Le code proposé ci-dessus est uniquement là pour faciliter la compréhension. Sauf besoin particulier, la version simplifiée doit suffire.

3. Passer d’un format catalog à un dataset

Dans un second temps, je vous propose de convertir ce format dans un autre dataset.

proc format cntlout=pop2; 
run;

Ainsi le code au dessus est équivalent à :

proc format cntout=work.pop2 lib=work.formats; 
run;

A vous de jouez avec les proc print et librairies pour voir la résultat.

4. Rappel sur le nom du format

Notez ici que le nom du format est au maximum long de 32 caractères en  SAS 9.1.3 / SAS 9.2  et limité à 8 caractères pour la version SAS 8.2. Pour être plus précis, on a 32 caractères pour un format numérique et 31 caractères pour un format alphanumérique en SAS 9.1.3 et SAS 9.2, SAS gardant un caractère pour le symbole dollar $. SAS 8.2 fonctionnait sur le même principe : 8 caractères pour un format numérique et 7 caractères pour un format alphanumérique. Si le nom du format était trop long en SAS 8.2, SAS le coupe à la longueur maximum. Ainsi les nom  ALPHABETA et ALPHABETI sont interprétés pas SAS 8.2 en FMTNAME=ALPHABET pour un format numérique.

Aller plus loin

h1

20 pistes pour vérifier le contenu d’un data set

février 16, 2010

AA : Faites des vérifications sur ces données.

BB: Vous avez un descriptif des choses que vous voulez voir vérifier ? AA : Non.

BB: J’imagine donc que vous ne savez pas quelles sont les vérifications les plus importantes ? AA : Oui c’est bien cela.

BB: Vous savez sous quelle forme vous voulez avoir l’information ? BB: Lisible.

Voici quelques pistes pour aborder ce genre de travail.

1. Travailler au niveau de la cellule

Pour chaque variable, listez les valeurs possibles.

  1. la variable A peut ne prendre que les valeurs N ou Y, ne peut prendre que des valeurs manquantes ? (valeurs discrètes).
  2. Dans quel intervalle les valeur sont-elles autorisées ? (valeurs continues).
  3. Les valeurs manquantes sont-elles autorisées ? Si oui, lesquelles pour les variables numériques : le point, .A, ._, etc. ?
  4. Les valeurs numériques doivent-elles être arrondies ?
  5. La case des variables caractères est importante ? Tout doit-il être en majuscule ?
  6. Les blancs de début, de fin ou les blancs multiples sont-ils autorisés ?
  7. Est-ce que plus d’un seul mot est autorisé ?
  8. Est-ce que les caractères spéciaux sont autorisés et si oui lesquels ? Seulement les caractères imprimables ?

2. Le cas particulier des dates

  1. Pour les variables jour, mois et années, clarifiez si la date doit être complète ou non ?
  2. Si une date incomplète est autorisée, parle t-on d’une date où seul le jour peut-être manquant, où le jour et le mois peuvent être manquants, où le jour, le mois et l’année peuvent être manquants ?
  3. Comment gère t-on les dates dans le futur ? Utilise-t-on le moment d’exécution du programme comme date séparant le passé du futur ?  Si le jour et le mois sont manquants, dit-on que l’année en cours est une valeur valide ? Ainsi, si l’année 2011 est entrée, quel est le résultat si le programme est exécuté le 31 décembre 2010 et le 1er janvier 2011 ?
  4. Comment comparer deux dates autorisant des valeurs manquantes ?

3. Travailler avec plusieurs lignes et/ou colonnes

Après avoir vérifier les valeur valables au niveau de la cellule, il s’agit de faire des comparaisons horizontales et verticales, sur toute une ligne, toute une colonne ou seulement certaines variables d’une ligne ou certaines variables d’une colonne. Voir plusieurs lignes et plusieurs colonnes.

  1. Il vous faudra clarifier si les doublons dans une variable sont autorisés.
  2. Pensez à inverser la requête. Par exemple, si les valeurs de ma variable CRITERIA finissent pas OLD alors je parle d’anciens critères. Ma requête vérifiera que lorsque CRITERIA=xxOLD alors FLAG=OLD d’une part et que lorsque FLAG=OLD, CRITERIA=xxOLD : if not (substr(criteria,length(criteria)-2)=’OLD’ and flag=’OLD’);
  3. La plus grande difficulté consistera à éviter d’avoir plusieurs requêtes pour une seule valeur erronée. Par exemple, vous avez trois variables oui/non: AA, BB et CC. La première requête vérifera que AA=Y ou AA=N, que BB=Y ou BB=N et que CC=Y ou CC=N. Ensuite, si AA=Y alors REFEREFENCE ne doit pas être manquant. Il est important ici de ne pas avoir une requête supplémentaire si déjà AA  a des valeurs non autorisés identifiées précédemment.

4. Documenter les requêtes dans un tableau

  1. Vous aurez souvent intérêt à lister toutes vos requêtes dans une table. Que vous lirez par la suite.
  2. Il peut être intéressant d’identifier chaque requête par un nom plutôt qu’un numéro cas très probable où de nouvelles requêtes doivent s’insérer entre des requêtes déjà existantes. Vous pouvez ensuite insérer un numéro pour le tri uniquement.
  3. Une autre table peut servir à lister les exceptions à la règle.

5. Présenter les résultats dans un tableau

Enfin, la présentation sous forme de tableau s’avèrera plus lisible qu’un fichier .rtf, .pdf.

  1. D’une part le volume est moindre avec un tableau qu’avec un fichier textuel. Cela décourage moins les personnes qui doivent le lire.
  2. D’autre part, sous Excel, les utilisateurs apprécieront les filtres et la possibilité de trier les données.

Vous pouvez étendre cette réflexion au cas où vous devez vérifier plusieurs tableaux. Quelles sont les variables communes aux différentes sources. Dans quelle mesure doivent-elles être compatibles ? Est-il préférable de tout programmer dans un seul programme ou d’appeler un programme par requête ? Il faudra

h1

Deux manières de créer un data set vide

juillet 2, 2009

Dans un précédent article Copier la structure d’un data set et se séparer des données, nous avons vu comment récupérer la structure d’une table (data set) de référence, c’est-à-dire copier les caractéristiques des variables sans les données. Ici, vous verrez comment créer un data set, appelé EMPTY, sans données et sans se baser sur un data set de référence.

L’intérêt est de souvent de pouvoir ensuite empiler des data sets ayant des longueurs de variables. En effet la longueur d’une variable rencontrée dans le premier data set sera la longueur de référence. Il ne faut pas qu’elle soit plus petite que celle du data set suivant. Autrement le texte des observations d’après est coupé (truncated).

1. Avec une étape data

Au choix, vous avez l’instruction ATTRIB ou les différentes instructions LABEL, LENGTH, FORMAT, INFORMAT pour créer les variables du data set.

data empty;
attrib var_text   label=‘Var. caractère, longueur 20’ length=$20
var_num_dt label=‘Var. numérique, longueur 8’ format=date9.;
stop;
run;

Dans la log, SAS précisera qu’aucune valeur n’a été donné aux variables VAR_TEXT et VAR_NUM_DT.

NOTE: Variable var_text is uninitialized.
NOTE: Variable var_num_dt is uninitialized.

2. Créer un data set vide avec la procédure SQL

La procédure SQL

proc sql;
create table empty
(
var_text char(20) label=‘Var. caractère, longueur 20’ ,
var_num_dt num label=‘Var. numérique, longueur 8’ format=date9.
);
quit;

3. Voir le résultat

J’ai choisi d’ajouter l’option VARNUM à la procédure PROC CONTENTS pour afficher les données dans l’ordre

proc contents data=empty varnum;
run;

La variable VAR_TEXT apparaît en premier. Il s’agit d’une variable alphanumérique de longueur 20 sans format et ayant pour libellé : Var. caractère, longueur 20.

La seconde variable VAR_NUM_DT est numérique, de longueur 8. Le format DATE9 est appliqué dessus de manière permanente. Le libellé de cette variable est : Var. numérique, longueur 8.

The CONTENTS Procedure

Variables in Creation Order

# Variable   Type   Len Format Label

1 var_text   Char   20         Var. caractère, longueur 20
2 var_num_dt Num     8  DATE9. Var. numérique, longueur 8

Lectures complémentaires