Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/11/2011, 13h21   #1
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Alimentation

Informations forums :
Inscription : novembre 2011
Messages : 40
Points : 13
Points : 13
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 :
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.
Hélixe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2011, 16h02   #2
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
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.);
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2011, 21h33   #3
Membre régulier
 
Femme Mariam
Statisticienne-Consultante BI
Inscription : avril 2008
Messages : 127
Détails du profil
Informations personnelles :
Nom : Femme Mariam
Localisation : Canada

Informations professionnelles :
Activité : Statisticienne-Consultante BI
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 127
Points : 96
Points : 96
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 :
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);
MDsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 11h05   #4
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 957
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 957
Points : 1 368
Points : 1 368
Une autre solution:

Code :
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);
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 11h42   #5
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 011
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

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

Informations forums :
Inscription : février 2011
Messages : 1 011
Points : 1 712
Points : 1 712
Une autre solution.
Code :
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;
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/11/2011, 19h30   #6
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Alimentation

Informations forums :
Inscription : novembre 2011
Messages : 40
Points : 13
Points : 13
Merci beaucoup, j'ai fait un peu de bricole en piochant dans vos trois solutions.
Ca marche impec !
Hélixe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 20h01   #7
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 011
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

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

Informations forums :
Inscription : février 2011
Messages : 1 011
Points : 1 712
Points : 1 712
tu peux nous montrer comment t'as procéder ?
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 17h08   #8
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Alimentation

Informations forums :
Inscription : novembre 2011
Messages : 40
Points : 13
Points : 13
Code :
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à !
Hélixe est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h31.


 
 
 
 
Partenaires

Hébergement Web