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 :

Détecter une variable numérique convertie en caractère avec les NA, ND


Sujet :

Macro

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Data Manager
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Détecter une variable numérique convertie en caractère avec les NA, ND
    /*Bonjour tout le monde,

    Je rencontre aujourd'hui une difficulté sur SAS.

    J'ai une base de données où il y a des variables numériques et des variables caractères et ce que je cherche à faire c'est trouver le minimum et le maximum de chacune des variables numériques.
    Mais attention :
    ->Certaines variables numériques ont été converti en caractères. Je souhaite prendre en compte ces variables et chercher leur minimum et maximum.
    ->Enfin, il faut savoir que pour ces variables converties en caractères, on observe certaines modalités NA (non applicable) ou ND (non disponible).

    C'est un processus que je souhaite automatiser en ne rentrant que le nom de la table.

    J'ai particulièrement du mal sur le dernier point : Détecter une variable numérique convertie en caractère avec les NA, ND.

    Je peux vous montrer un squelette de mon programme :
    J'attend d'avoir un truc qui marche avant de le mettre sous forme de macro-programme.*/

    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
     
    %macro verif_num_char(string);
    	DATA _NULL_;
    		var=input("&string" ,?? COMMA8.);
    		IF var=. then call symput('type','CHAR');
    		else call symput('type','NUM');
        run;
    	%put &type;
    %mend;
     
    %verif_num_char(%quote(&ahah));
     
    proc sql;
    	select J7_OXY_SATEV into : ahah from respi;
    quit;
     
    /*Le macro programme ci-dessus ne permet pas de reconnaître une variable caractère contenant des NA, ND en numérique.*/
     
    proc contents data=respi out=temp noprint;
     
    data _null_;
    set temp END=EOF;
    call symput("type"||left(_N_),type);
    call symputx("var"||left(_N_),name);
    if EOF then call symputx("nbvar",_N_);
    run;
     
    proc delete data=temp;
    run;
     
    %DO i_=1 %TO &nbvar.;
     
    	%if &&type&i. = 1 %then %do;  /*Numériques*/
     
    		data _null_;
    		set &table.;
    		call symputx("var2",VLABEL(&var.));
    		run;
     
    		proc sql noprint;
    			select min(J7_D) into : min
    			from respi;
    		quit;
     
    		proc sql noprint;
    			select max(J7_D) into : max
    			from respi;
    		quit;
     
    		data MinMax;
    		set MinMax;
    		attrib Var format=$300.;
    		attrib Min format=$20.;
    		attrib Max format=$20.;
    		Var=&var2.;
    		Min=&min.;
    		Max=&max.;
    		run;
     
    	%end;
     
    	%if &&type&i. = 2 %then %do;  /*Caractères*/
     
    	/*Le grand vide...*/
     
    	%end;
    %END;
     
    %IF %sysfunc(exist(MinMax_All)) ne 1 %THEN %DO;
     
    	data MinMax_All;
    	set MinMax_All;
    	attrib Var format=$300.;
    	attrib Min format=$20.;
    	attrib Max format=$20.;
    	stop;
     
    	%end;
     
    	data MinMax_All;
    	set MinMax_All MinMax;
    	run;
    /*Ce serait vraiment super cool si vous arrivez à m'aider */

  2. #2
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    si tu forçais la conversion des var caractères en numériques, les NA et ND se transformeront en . ; ne serait-pas suffisant pour ne pas en tenir compte et avoir toutes tes variables en numérique pour ensuite faire une proc means ?
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Data Manager
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse datametric.

    Seulement, il existe plusieurs problèmes à ta solution :
    - J'ai environ 600 variables caractères et ton idée impose de transformer toutes les variables caractères en numériques. Cela prend un temps énorme. 600 * 3.34 secondes pour mon pc...
    - Un autre problème plus important se pose. J'ai essentiellement des variables caractères codées sous forme de questions fermées et les transformer en numérique n'est pas ce que je souhaite. Par exemple, une variable caractères à 3 modalités(ex: Jeune, Adulte, Vieux) me donnerai : les modalités : 1, 2 et 3. Et lorsque je chercherai le minimum, on me renverra (1) une valeur que je ne souhaite pas obtenir.

    Si vous avez d'autres idées n'hésitez pas

  4. #4
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    je pensais plutôt transformer les variables qui t'intéressent et pas toutes. Donc celles contenant des valeurs 0-9 +ND ou NA.
    Avec un ARRAY qui les listerait ca devrait aller vite.
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Data Manager
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    C'est justement ce que je ne sais pas faire :/
    Je ne sais pas comment lister ces variables sans le faire à la main.
    Si tu pourrais m'aider avec l'idée du ARRAY, j'apprécierai vraiment

    (je n'ai jamais été amené à en utiliser)

  6. #6
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 625
    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 625
    Points : 3 403
    Points
    3 403
    Par défaut
    Hello,
    Je n'ai pas tout saisi, est ce que tu veux calculer le minimum et le maximum de toutes les variables caractères et des variables numériques ? as-tu des variables caractères qui ne sont pas résultats de transformations du numérique ?

    PS: array ne permet pas de calculer le minimum ou le maximum d'une variable ou d'automatiser ce processus, il faut passer par une proc sql ou means par exemple.

    la solution que je vois : c'est de récupérer les variables caractères ( comme tu l'a fait avec une proc contents ) puis faire une boucle et tester si la variable contient un NA ou ND alors récupérer son nom et à l'aide d'une autre proc sql tu calcule le min et max de toutes les variables obtenues + les variables numériques ).

    Sinon as tu un critère en commun dans le nom des variables caractères résultants d'une transformation numérique => caractère ?
    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

  7. #7
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    Même si je te donne le code tu devras les lister. Le système ne peut les sélectionner pour toi sans une une règle qui pourrait se coder (toutes les variables commencant par T par exemple...)

    ca doit faire un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Data test;
    set test;
     
    ARRAY mescvar(*) $ t1-t9; /*les sources*/
    ARRAY mesnvar(*)  nt1-nt9; /*les cibles car on ne transforme pas des variables, on en crée d'autres */
     
    do i = 1 to dim(mescvar);
    mesnvar(i) = mescvar(i) * 1;
    End;
    run;
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Data Manager
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Je vous remercie à nouveau pour vos réponses.

    datametric : La seule règle que je puisse te donner pour repérer les variables numériques au format caractères, c'est que ce sont les seules variables caractères à contenir des chiffres. Ces variables ont par contre en commun avec les autres variables caractères des modalités NA, ND.
    C'est vraiment un processus d'automatisation que je cherche à faire les lister une par une ne doit pas être à faire.

    s_a_m : Salut s_a_m, mon but final est de calculer le minimum et le maximum de chacune de mes variables numériques. Seulement le problème qui se pose à moi c'est que certaines variables caractères contiennent des données chiffrées et je souhaite pour elles aussi calculer le minimum et le maximum. Pour ces dernières, il existe des NA, ND en plus des données chiffrées. Et ma grande difficulté résulte à lister ces variables caractères contenant des données chiffrées mais aussi quelques fois des NA, ND.
    J'espère avoir réussi à me faire comprendre^^.

  9. #9
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    d'une façon ou d'une autre pour transformer la variable A en B il te faut les lister. Ce qu'il te manque avant mon ARRAY c'est l'énumération des variables contenant des numériques et l'enregistrement de ces variables dans une macro liste typiquement.
    Pour cela il te faut énumérer les valeurs et tester le contenu et récupérer son nom.

    Un exemple consiste à transposer la table. Sinon tu peux faire une FREQ etc.


    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
    data test;
    input (var1-var6) ($) ;
    datalines;
    1 2 3 A B C
    4 ND NA D E F
    1 2 3 A B C
    4 ND NA D E F
    1 2 3 A B C
    4 ND NA D E F
    1 2 3 A B C
    4 ND NA D E F
    ;
    run;
    proc transpose data=test out=t1;
    var v: ;
    run;
     
    data t2;
    set t1;
    Jegarde=(SUM(OF COL:)>.);
    run;
     
    proc sql;
    select _NAME_ into :list separated by ' ' 
    from t2
    where jegarde=1
    ;
    quit;
    %put list=&list;
    Cependant, la première option (rapide et sale) reste de tout transformer en numérique. Celles contenant uniquement des modalités $ contiendront forcément des .
    Ensuite une proc MEANS.

    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
    data test;
    input (var1-var6) ($) ;
    datalines;
    1 2 3 A B C
    4 ND NA D E F
    ;
    run;
     
    data test;
    set test;
    array c (*) var1-var6 ;
    array n (*) nvar1-nvar6 ;
    do i = 1 to dim(c);
    n(i) = c(i)*1;
    end;
    run;
     
    proc means min mean max;
    run;
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Data Manager
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    datametric : Je suis en train de tester tes idées. La première consistant à utiliser une proc transpose et de faire une colonne somme par la suite me pose du soucis car la procédure semble enlever le format des variables. Du coup je me retrouve avec des variables Oui/Non codées en 0/1 dans les variables numériques.

    Je pense qu'il peut y avoir quelque chose à prendre tout de même de ton code alors je continue de regarder ce que je peux faire.

    Je te remercie encore de tant m'aider.

  11. #11
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    Ah oui là il va falloir rester circonspect.
    si tu as des boolennes dans certains cas, c'est donc du numérique avec ou sans format.

    tu es entrain de dire que les ND ou les NA sont issus de formats ?
    Si c'est ça, tu peux tout reprendre à zéro. il n'y a pas de conversion nécessaire vers du numérique c'est déjà fait.
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/02/2015, 11h19
  2. Réponses: 2
    Dernier message: 29/04/2014, 17h12
  3. [DATA] Remplir valeur d'une variable numérique avec des If
    Par Oreo_ dans le forum SAS Base
    Réponses: 2
    Dernier message: 17/06/2013, 13h46
  4. Réponses: 2
    Dernier message: 24/09/2007, 12h47
  5. [JSTL] Récupérer une variable JSTL pour l'utiliser avec JSP
    Par pitit777 dans le forum Taglibs
    Réponses: 3
    Dernier message: 28/03/2006, 09h47

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