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 :

Transformer variables numériques en caractères avec un ARRAY


Sujet :

Macro

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Alimentation

    Informations forums :
    Inscription : Novembre 2011
    Messages : 46
    Par défaut Transformer variables numériques en caractères avec un ARRAY
    Bonjour,

    J'ai un fichier qui contient des variables numériques et des variables caractères.
    Je voudrais transformer toutes les variables numériques en caractères.

    Pour ce faire, j'ai pensé à utiliser un ARRAY comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DATA Test1 (DROP = j);
    SET Test;
    	ARRAY _numvar_{*}_numeric_;
    		j=i;
    		DO i = 1 TO DIM(_numvar_) WHILE (i le DIM(_numvar_)-1);
    			i = PUT (j,30.2);
    		END;
    	RENAME = (i=j);
    RUN;
    Le programme se lance mais ne s'arrête jamais. Je pense que je n'ai pas bien refermé la boucle mais je ne sais pas comment faire.

    Aussi, débutant en SAS, s'il y a un autre moyen, peut-être plus simple, pour convertir mes variables numériques en caractères, je suis tout ouïe

    Merci d'avance.

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Par défaut
    Bonjour,
    Il manque un end pour la boucle while.
    il te faut créer un nouveau vecteur de type caractère pour stocker les nouvelles valeurs.

    put(_numvar_[i],$10.);

  3. #3
    Membre éclairé
    Femme Profil pro
    Analyste en Intelligence d'Affaires (BI)
    Inscrit en
    Avril 2008
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste en Intelligence d'Affaires (BI)
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 245
    Par défaut
    Bonjour,

    Voici une autre solution (un petit peu longue...mais bon...si tu veux pas des ARRAY) concoté avec des programmes trouvés ici et la sur le forum :-)

    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
    %macro numentext (table_entree=, table_sortie=) ;
     
    /* on récupère le nom des variables*/
    proc contents DATA =&table_entree out=name;
    run;
     
    /* garder l'ordre initial des variables*/
    proc sort DATA=name;
    BY varnum;
    run;
     
    /* on stock les variables sous forme de liste*/
    proc sql noprint;
    SELECT name INTO:liste separated BY ' ' FROM name ;
    SELECT name INTO:liste_char separated BY ' ' FROM name  where TYPE= 2 ;/*2 numeric*/
    SELECT name INTO:liste_num separated BY ' ' FROM name where TYPE= 1 ;/* 1 @numeric*/
    SELECT count(*) INTO :nb FROM name;/*nombre total de variables*/
    SELECT count(*) INTO :nb_num FROM name where TYPE= 1 ;/* nombre qui nous interesse*/
    SELECT count(*) INTO :nb_char FROM name where TYPE= 2  ;/* juste au cas ou*/
    quit;
     
    /*affichage dans l'output*/
    %put liste_variable=&liste.;
    %put liste_variable_num=&liste_num.;
    %put liste_variable_char=&liste_char.;
    %put nombre_var_tot=&nb.;
    %put nombre_var_num=&nb_num.;
    %put nombre_var_char=&nb_char.;
     
    DATA test;
    %do i=1 %TO &nb_num;
    %let x_num=%scan(&liste_num , &i,' ');/*on scanne élément de la liste de variables afin de renommer en COL&i*/
    SET sashelp.class;
    RENAME &&x_num=COL&i.;
    %end;
    run ;
    /*Changer les variables numeriques en characteres*/
    DATA test1;
    set test ;
    %do i=1 %TO &nb_num;
    var&i= put(COL&i. , $12.2);/*changement de format---ENFIN*/
    %end;
    run;
    /*Nommer les variables avec le nom d'origine*/
    DATA &table_sortie;
    %do i=1 %TO &nb_num;
    %let x_num=%scan(&liste_num , &i,' ');
    SET test1;
    RENAME var&i=&&x_num;
    drop COL&i;
    %end;
     
    %mend;
    %numentext (table_entree=sashelp.class, table_sortie=resultat);

  4. #4
    Membre Expert
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Par défaut
    Une autre solution:

    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
    DATA test;
    input x y $ z$;
    cards;
    1 3 5
    8 7 0
    ;
    run;
     
    %MACRO  CONVERT_ALPHA_NUMERIC(table_in=, table_out=);
     
    proc contents DATA=&table_in. out=out;
    run;
     
    DATA out;
    SET out;
    WHERE type=2;
    new=compress(name!!"_num");
    run;
     
    proc sql noprint;
    SELECT new INTO :new separated BY ' ' FROM out;
    SELECT name INTO :name separated BY ' ' FROM out;
    SELECT count(*) INTO :nb  FROM out;
     
    quit;
     
    %put new=&new;
    %put name=&name;
     
    DATA &table_out.;
    SET &table_in.;
    array new(*) &new.;
    array name(*) &name.;
    do i=1 TO dim(new);
    new(i)=input(name(i),best.);
    end;
    DROP i &name;
    run;
     
    DATA &table_out.;
    %do i=1 %to &nb.;
    %let x=%scan(&new,&i.,' ');
    %let y=%scan(&name,&i,' ');
    set  &table_out.;
    rename &&x=&&y;
    %end;
    run;
     
    %MEND;
     
    %CONVERT_ALPHA_NUMERIC(table_in=test, table_out=test2);

  5. #5
    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
    Par défaut
    Une autre solution.
    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
     
    data test;
    set sashelp.class;
    run;
     
    %macro to_char;
     
    proc sql noprint;
       select name, '_'!!name ,max (monotonic()) into: old_var separated by ',',: new_var separated by ','  ,: nbr 
       from dictionary.columns where upcase(libname)='WORK' and upcase(memname)='TEST' and upcase(type)='NUM';
    quit;
     
    data new       ( drop  =  %do i=1 %to &nbr. ; %scan("&new_var",&i,",") %end;);
     
    set test (  rename=( %do i=1 %to &nbr. ; %scan("&old_var",&i,",")=%scan("&new_var",&i,",") %end; )  );
     
          %do i=1 %to &nbr.;
             %scan("&old_var",&i,",")=put(%scan("&new_var",&i,","), best.);
          %end;
    run;
    %mend;
     
    %to_char;
    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

  6. #6
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Alimentation

    Informations forums :
    Inscription : Novembre 2011
    Messages : 46
    Par défaut
    Merci beaucoup, j'ai fait un peu de bricole en piochant dans vos trois solutions.
    Ca marche impec !

  7. #7
    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
    Par défaut
    tu peux nous montrer comment t'as procéder ?
    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

  8. #8
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Alimentation

    Informations forums :
    Inscription : Novembre 2011
    Messages : 46
    Par défaut
    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
    %MACRO CHAR;
     
    PROC CONTENTS DATA = char OUT = colonne NOPRINT;
    RUN;
     
    /*	Création des macro-variables	*/
    PROC SQL NOPRINT;
    	SELECT name INTO :old_var separated BY ',' FROM colonne WHERE TYPE = 1;
    	SELECT '_'!!name INTO :new_var separated BY ',' FROM colonne WHERE TYPE = 1;
    	SELECT count(*) /*Alternative : MAX(MONOTONIC())*/ INTO :nbr FROM colonne WHERE TYPE = 1;
    QUIT;	
     
    /*	Changement des variables numériques en caractères et suppression des anciennes variables	*/
    DATA char (DROP = %DO i=1 %TO &nbr.;
    		    %SCAN ("&new_var",&i,",")
    		  %END;);
    SET char (RENAME = (%DO i=1 %TO &nbr.;
    			%SCAN ("&old_var",&i,",") = %SCAN ("&new_var",&i,",")
    		    %END;));
    	%DO i=1 %TO &nbr.;
        	    %SCAN ("&old_var",&i,",") = PUT(%SCAN ("&new_var",&i,","), BEST.);
    	%END;
    RUN;
     
    %MEND CHAR;
    Voilà voilà !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/02/2015, 11h19
  2. Réponses: 10
    Dernier message: 13/05/2014, 17h06
  3. Réponses: 1
    Dernier message: 03/03/2014, 12h12
  4. Réponses: 3
    Dernier message: 12/06/2006, 11h18
  5. Print texte et variable numérique (+ caractère ASCII)
    Par micatmidog dans le forum Général Python
    Réponses: 4
    Dernier message: 15/12/2005, 22h21

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