IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

Récupérer le nombre de valeurs manquantes pour chaque variable d'une table SAS


Sujet :

Macro

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Récupérer le nombre de valeurs manquantes pour chaque variable d'une table SAS
    Bonjour,

    Voilà, j'ai une table SAS avec plusieurs variables (id, note, habitation,...).
    j'aimerais faire une procédure qui me renvoie en sortie une table qui contient le nbre de valeurs manquantes pour chacune des variables de la table initiale.
    J'ai essayé avec FREQ et l'option MISSPRINT. le problème c'est que je dois écrire la proc FREQ pour chacune des variables.Et en plus,j'ai les fréquences de toutes les modalités de la variable.
    Quelqu'un peut-il m'aider svp? Par avance merci.

  2. #2
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    C'est possible via la proc means ou la proc univariate. il y a l'option NMISS

  3. #3
    Membre éclairé
    Homme Profil pro
    responsable adjoint service stat
    Inscrit en
    Mars 2009
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : responsable adjoint service stat
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 448
    Points : 823
    Points
    823
    Par défaut
    il y a aussi la fonction nmiss() pour la proc sql, pour ceux qui aiment...

  4. #4
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Manoutz Voir le message
    C'est possible via la proc means ou la proc univariate. il y a l'option NMISS
    Manoutz, quel doit être le format des variables pour utiliser la proc means. Mes variables sont de type "chaîne de caractères". Est-ce-que ça marche?
    Merci pour ton aide.

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par RemiBousquet Voir le message
    il y a aussi la fonction nmiss() pour la proc sql, pour ceux qui aiment...
    RemiBousquet, cmt s'utilise le nmiss dans la proc sql svp? Merci

  6. #6
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    Proc univariate et means ne fonctionnent que sur des variables de type numérique.

    le code en sql:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    proc sql;
    select nmiss(testvar)
    from test
    ;
    quit;

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Quelle fonction peut-on utiliser pour connaitre le nbre de valeurs manquantes d'une variable de type "chaîne de caractères" svp? merci

  8. #8
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    Comme indiqué dans mon exemple du précédent post, la solution de Rémi via sql fonctionne pour les chaîne de caractères...

  9. #9
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Ca fonctionne avec le nmiss de la proc sql.
    Merci pour votre aide

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 30
    Points : 22
    Points
    22
    Par défaut
    Je relance ce topic vieux de 4 ans car ma question est à la base la même que coco_chanel86, mais les réponses données m'ont apporté une autre interrogation !

    Je souhaite utiliser la PROC SQL pour compte le nombre de valeurs manquantes d'une table tout en automatisant le processus via une macro. En effet, pour l'instant j'en suis à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PROC SQL ;
    	select nmiss(VAR1) as VAR1_NA, ... , nmiss(VAR9) as VAR9_NA
    	from tab ;
    QUIT ;
    ce qui est assez laborieux, qui plus est quand on a plusieurs tables !

    Je cherche donc une macro avec comme unique paramètre la table des données, et qui me retourne le nombre de NA de toutes mes variables. J'espère avoir été clair

    Merci à ceux qui ont lu, et à ceux qui répondront.

  11. #11
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 624
    Points : 3 402
    Points
    3 402
    Par défaut
    Hello,
    En code macro tu peux faire:
    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
     
    data T1;
      input var $ VAR1 $ VAR2 $ VAR3 VAR4;
    DATALINES;
    A . D 5 3
    . F . 5 3
    H T Z . 3
    . . A 5 2
    Z R Z . 6
    Z R Z . 8
    E W R 3 0
    ;
    run;
     
    proc sql;
    reset noprint;
    select cat( 'nmiss( ' , strip(name) , ' ) as ' ,strip(name), ' '   )into: list_var separated by ',' from dictionary.columns
    where upcase(libname)='WORK' and upcase(memname)='T1';
    quit;
     
     
    proc sql;
    create table test as select &list_var.
    from t1;
    quit;
    La proc MEANS te permet également de calculer le nombre de valeurs manquantes par variables numérique.
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 30
    Points : 22
    Points
    22
    Par défaut
    Waouh. Je suis très impressionné par ta réponse !! Merci beaucoup, ça marche d'enfer

    Il y a cependant un petit hic ; je n'arrive pas à adapter ton exemple à mes données, et ce pour la raison que je ne comprends pas ce que fait la première PROC SQL

    Ces deux lignes me font fumer le cerveau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT cat( 'nmiss( ' , strip(name) , ' ) as ' ,strip(name), ' '   )INTO: list_var separated BY ',' FROM dictionary.COLUMNS
    WHERE upcase(libname)='WORK' AND upcase(memname)='T1';
    Je comprends qu'on stocke les variables et les NA correspondantes dans l'objet list_var, mais c'est à peu près tout
    Peux-tu apporter quelques précisions sur la méthode s'il-te-plaît ?

  13. #13
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 624
    Points : 3 402
    Points
    3 402
    Par défaut
    - La première procédure sql permet de récupérer les variables de ta table à partir des vues dictionary de sas.
    Toi tu dois remplacer la bibliothèque WORK par le nom de ta bibliothèque et la table T1 par le nom de ta table.
    Tu peux aussi faire une proc contents et récupérer le nom de tes variables.

    - la deuxième proc sql, je t apprends rien elle calcule le nombre de valeurs manquantes pour chaque variables.
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  14. #14
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,


    Tu peux également utiliser array

    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
     
    %macro CalculNmiss(tab_entree,tab_sortie);
    data inter ;
     set &tab_entree.;
     array cha _character_;
     array num _numeric_;
    do over cha;
     if missing(cha) then do;
     vnm=vname(cha);
     output;
     end;
    end;
    do over num;
     if missing(num) then do;
     vnm=vname(num);
     output;
     end;
    end;
    run;
     
     
    proc sql;
    create table &tab_sortie. as
    select distinct vnm, count(*) as nmiss
    from inter
    group by vnm
    ;
    quit;
    %Mend CalculNmiss;
    %CalculNmiss (entree,sortie);

    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  15. #15
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 30
    Points : 22
    Points
    22
    Par défaut
    Merci beaucoup à tous les deux, cela me sera utile pour longtemps.

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 244
    Points : 138
    Points
    138
    Par défaut Complément d'information si ça vous intéresse
    Bonjour,

    Je trouve normal de partager ce que je fais car c'est grâce à ce site que je l'ai fait.
    Merci

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
     
    data WORK.T1;
      input VAR $ VAR1 $ VAR2 $ VAR3 VAR4;
    DATALINES;
    A . D 5 3
    . F . 5 3
    H T Z . 3
    . . A 5 2
    Z R Z . 6
    Z R Z . 8
    E W R 3 0
    ;
    run;
     
    data WORK.T2;
      input VAR $ VAR1 $ VAR2 $ VAR3 VAR4;
    DATALINES;
    A D D 5 3
    Y F W 5 3
    H T Z 1 3
    B U A 5 2
    Z R Z 2 6
    Z R Z 7 8
    E W R 3 0
    ;
    run;
     
    %macro affiche_RDM(ET, TABLE1, TABLE2=F);
     
    	%put *************************;
    	%put ;
    	%put ENVOI TABLE2 =>  &TABLE2.;
    	%put ;
     
    	proc sql noprint;
    	select name into:list_var separated by ' ' from dictionary.columns
    	where upcase(libname)="&ET." and upcase(memname)="&TABLE1.";
    	quit; 
     
    	proc sql noprint;
    	select cat('nmiss(', strip(name), ') as ', strip(name), ' ') into:list_varnmiss separated by ',' from dictionary.columns
    	where upcase(libname)="&ET." and upcase(memname)="&TABLE1.";
    	quit;
     
    	proc sql;
    	create table WORK.VALEURSCOMPTEES as select &list_varnmiss.
    	from &ET..&TABLE1.;
    	quit;
     
    	PROC SQL;
    		CREATE VIEW WORK.VALEURSCOMPTEES2 AS
    		SELECT SRC.*, "DM_&TABLE1." AS _EG_IDCOL_
    			FROM WORK.VALEURSCOMPTEES AS SRC;
    	QUIT;
     
    	PROC TRANSPOSE DATA = WORK.VALEURSCOMPTEES2 OUT=WORK.VALEURSCOMPTEES3;
    		ID _EG_IDCOL_;
    		VAR &list_var.;
    	RUN;
     
    	proc sort data=WORK.VALEURSCOMPTEES3;
    	by _name_ ;
    	run;
     
    	%if "&TABLE2." ~= "F" %then %do;
     
    	%put ;
    	%put ENTRE DANS LA CONDITION =>  OUI;
    	%put ;	
     
    		proc sql noprint;
    		select name into:list_var separated by ' ' from dictionary.columns
    		where upcase(libname)="&ET." and upcase(memname)="&TABLE2.";
    		quit; 
     
    		proc sql noprint;
    		select cat('nmiss(', strip(name), ') as ', strip(name), ' ') into:list_varnmiss separated by ',' from dictionary.columns
    		where upcase(libname)="&ET." and upcase(memname)="&TABLE2.";
    		quit;
     
    		proc sql;
    		create table WORK.VALEURSCOMPTEESB as select &list_varnmiss.
    		from &ET..&TABLE2.;
    		quit;
     
    		PROC SQL;
    			CREATE VIEW WORK.VALEURSCOMPTEES2B AS
    			SELECT SRC.*, "DM_&TABLE2." AS _EG_IDCOL_
    				FROM WORK.VALEURSCOMPTEESB AS SRC;
    		QUIT;
     
    		PROC TRANSPOSE DATA = WORK.VALEURSCOMPTEES2B OUT=WORK.VALEURSCOMPTEES3B;
    			ID _EG_IDCOL_;
    			VAR &list_var.;
    		RUN;
     
    		proc sort data=WORK.VALEURSCOMPTEES3B;
    		by _name_ ;
    		run;
     
    		data WORK.AFFICHE_RDM;
    		merge WORK.VALEURSCOMPTEES3 WORK.VALEURSCOMPTEES3B;
    		by _name_ ;
    		run;
     
    	%end;
    	%else %do;	
     
    	%put ;
    	%put ENTRE DANS LA CONDITION =>  NON;
    	%put ;
     
    		data WORK.AFFICHE_RDM;
    		set WORK.VALEURSCOMPTEES3;
    		run;
     
    	%end;
     
            %* table qui contient le résultat;
    	data WORK.AFFICHE_RDM;
    	set WORK.AFFICHE_RDM;
    	rename _name_ = 'Nom_variable';
    	run;
     
    %mend affiche_RDM;
     
    %affiche_RDM(WORK,T1);
    %affiche_RDM(WORK,T1,TABLE2=T2);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lien à attribuer pour chaque entrée d'une table
    Par Legendsnake dans le forum Langage
    Réponses: 6
    Dernier message: 28/04/2009, 18h55
  2. Réponses: 3
    Dernier message: 08/04/2009, 12h10
  3. Calcul de la Médiane pour chaque élément d'une table
    Par yuekerobero dans le forum Requêtes
    Réponses: 11
    Dernier message: 30/09/2008, 12h01
  4. Réponses: 2
    Dernier message: 04/07/2008, 20h11
  5. Réponses: 5
    Dernier message: 16/02/2007, 16h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo