Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macro Discussion :

Tables qui comptent les valeurs manquantes


Sujet :

Macro

  1. #1
    Membre à l'essai
    Tables qui comptent les valeurs manquantes
    Bonsoir,
    je bloque sur un erreur bizarre, je veux créer des tables qui comptent les valeurs manquantes mais je suis bloqué sur un erreur qui apparaître seulement pour une seule table !!!!!!!!!!!!
    Voici le code et l'erreur
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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
    %macro val_manquantes(BIB,TAB,ENV);
    	/*proc sql noprint;
    	select name into:list_var separated by ' ' from dictionary.columns
    	where upcase(libname)="&BIB." and upcase(memname)="&TAB.";
    	quit; 
     	*/
     
    	/*	Créer une macro variable list_varnmiss contenant la liste des variables de la table &BIB..&TAB. concaténées à nmiss()  */
    	proc sql noprint;
    	select cat('nmiss(', strip(name), ') as ', strip(name), ' ') into:list_varnmiss separated by ',' 
    	from dictionary.columns
    	where upcase(libname)="&BIB." and upcase(memname)="&TAB.";
    	quit;
     
    	/*  Calculer le nombre des valeurs maquantes par BO  */
    	proc sql;
    	create table WORK.VALEURSCOMPTEES_&TAB. as select distinct
    		cat(LB_BO,'_VAL_MANQUANTE' ) as STATS,
    		LB_BO,DT_IMAGE,&list_varnmiss.
    	from &BIB..&TAB.
    	group by STATS;
    	quit;
     
    	/*	Creer une macro variable list_vartotaux contenant la liste des variables de la table &BIB..&TAB. concaténées à count()  */
    	proc sql noprint;
    	select cat('count( ID_CONTRAT) as ', strip(name), ' ') into:list_vartotaux separated by ',' 
    	from dictionary.columns
    	where upcase(libname)="&BIB." and upcase(memname)="&TAB.";
    	quit;*/
     
    	/*  Calculer le nombre total d'observations des variables par BO  */
    /*	proc sql;
    	create table WORK.VALEURSCOMPTEES1_&TAB. as select 
    		cat(LB_BO,'_TOT' ) as STATS
            ,&list_vartotaux.
    	from &BIB..&TAB.
    	group by STATS;
    	quit;
     
    	/* Concatener les deux tables de calcul des valeurs manquantes et de calcul des totaux  */
    	Data Valeurs_mq_&TAB._&ENV.;
    	set WORK.VALEURSCOMPTEES_&TAB. WORK.VALEURSCOMPTEES1_&TAB.;
    	run;
    %mend;
    %val_manquantes(BUD_MOAR,T_FLUX,R);


  2. #2
    Expert confirmé
    Bonjour.
    Dans l'étape qui crée WORK.VALEURSCOMPTEES&TAB, tu veux aussi conserver les variables LB_BO et DT_IMAGE. Sauf qu'elles sont aussi incluses dans la liste de variables à alimenter avec des NMISS et que ta macro-variable contient des syntaxes type NMISS(Z) AS Z. Il y a donc un doublon de noms de variables. Il faudrait 1) soit changer les noms des variables créées (NMISS(Z) as nbMiss_Z par exemple), 2) soit éliminer dans la première proc SQL les colonnes LB_BO et DT_IMAGE des variables à traiter.
    Et sinon il y a la proc FREQ qui ferait ça pas mal, sans macros :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    PROC FORMAT ;
      VALUE varNum LOW-HIGH="Renseigné" OTHER="Manquant" ;
      VALUE $varCar LOW-HIGH="Renseigné" OTHER="Manquant" ;
    RUN ;
    PROC FREQ DATA=... ;
      TABLE _ALL_ / MISSING ;
      FORMAT _NUMERIC_ varNum. _CHARACTER_ $varCar. ;
    RUN ;

    Code auquel on peut ajouter un OUT= ou un ODS OUTPUT si tu veux créer une table, et un WHERE pour ne voir que les effectifs manquants.
    Bon courage.
    Olivier

  3. #3
    Membre à l'essai
    Pour la première solution, j'ai pas compris comment changer le nom. vous voulez dire ça ?
    code :


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    proc sql noprint;
    	select cat('nmiss(', strip(name), ') as ', strip(nb_name), ' ') into:list_varnmiss separated by ',' 
    	from dictionary.columns
    	where upcase(libname)="&BIB." and upcase(memname)="&TAB.";
    	quit;

  4. #4
    Expert confirmé
    Oui, dans cette partie du code. Dans le CAT, ce qui suit AS construit le nom des nouvelles variables. Si on leur ajoute un préfixe ou un suffixe, ça devrait éliminer l'erreur.
    Bon courage.
    Olivier

###raw>template_hook.ano_emploi###