Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
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 16/12/2010, 14h39   #1
Invité de passage
 
Inscription : avril 2009
Messages : 11
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 11
Points : 2
Points : 2
Par défaut convertir variable sur jeu de données

Bonjour,

J'ai un petit problème au niveau de mon code.
J'ai une table contenant pas mal de variable (plus de 800).
Certaines variables qui doivent être numériques sont en caractères du fait de la présence du mot "NA".
Je voudrais remplacer NA par vide et ensuite convertir mes variables en numériques.
Et là, je n'y arrive pas.
voila le code ...


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
DATA matable;
input v1 $ v2 v3 $ v4 v5 v6 $; 
cards;
2 2 NA 7 0 NA
3 9 NA 4 6 5
6 10 1 1 8 5
NA 1 3 0 1 6
9 15 8 0 9 9
4 10 1 0 4 NA
5 16 3 0 6 NA
;
run;
Code :
1
2
3
4
5
6
7
8
9
10
 
DATA matable2;
SET matable;
array konvert {*} _CHARACTER_;
do i=1 TO dim(konvert);
	IF konvert(i)="NA" then do; 
	konvert(i)="";
 	konvert_n(i)=input(konvert(i),2.);	 /* je voudrais que les variables numériques termine par "_n" */			   
end;
run;

Où dois-je spécifier l'instruction pour la conversion et comment ?!?

Merci pour votre aide
dev_grou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 15h08   #2
Membre chevronné
 
Avatar de steelspirit
 
Inscription : janvier 2008
Messages : 420
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2008
Messages : 420
Points : 739
Points : 739
Envoyer un message via MSN à steelspirit
Pas si simple en effet ...
Dans ton code il manque l'array konvert_n mais du coup t'es obligé de connaitre le nombre de variables que tu souhaites créer (3 dans ton exemple) :

Code :
1
2
3
4
5
6
7
8
9
10
 
DATA matable2;
SET matable;
array konvert {*} _CHARACTER_;
array konvert_n {3} NV1-NV3;
do i=1 TO dim(konvert);
	IF konvert(i)="NA" then konvert(i)="";
 	konvert_n(i)=input(konvert(i),2.);	 
end;
run;
Avec plus de 800 varaibles ça risque d'être long

Steel
steelspirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 15h27   #3
Membre chevronné
 
Avatar de steelspirit
 
Inscription : janvier 2008
Messages : 420
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2008
Messages : 420
Points : 739
Points : 739
Envoyer un message via MSN à steelspirit
En récupérant la liste des variables caractères dans une macro variable et avec un peu de bidouillage c'est jouable :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
proc sql noprint;
	SELECT name, name
	INTO :char_var_list separated BY ' ', :num_var_list separated BY '_n '
	FROM DICTIONARY.COLUMNS
	WHERE libname="WORK" AND memname="MATABLE" AND type="char";
quit;
%put liste char=&char_var_list;
%let num_var_list=&num_var_list._n ; /* ajout de _n pour le dernier */
%put liste num=&num_var_list;
 
DATA matable2;
SET matable;
array konvert {*} &char_var_list;
array konvert_n {*} &num_var_list;
do i=1 TO dim(konvert);
	IF konvert(i)="NA" then konvert(i)="";
 	konvert_n(i)=input(konvert(i),2.);	 
end;
run;
Steel
steelspirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 15h30   #4
Invité de passage
 
Inscription : avril 2009
Messages : 11
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 11
Points : 2
Points : 2
@steelspirit : Merci d'avoir compléter le code.

Oui, ca risque d'être très long, il faut que j'évite ca mais comment ...

En plus, il faut que je reprenne le même nom de variable initial auquel j'ajoute "_n".

La, je suis un peu perdu.
dev_grou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 15h31   #5
Membre chevronné
 
Avatar de steelspirit
 
Inscription : janvier 2008
Messages : 420
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2008
Messages : 420
Points : 739
Points : 739
Envoyer un message via MSN à steelspirit
Citation:
En plus, il faut que je reprenne le même nom de variable initial auquel j'ajoute "_n".
Cf mon post précédent
steelspirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 16h00   #6
Invité de passage
 
Inscription : avril 2009
Messages : 11
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 11
Points : 2
Points : 2
@steelspirit : Merci ca marche impecc sur l'exemple.

Je vais t'embêter un peu .
lorsque j'appelle ma table se trouvant dans ma librairie, et que j'execute

Code :
1
2
3
4
5
6
7
 
proc sql noprint;
	SELECT name, name
	INTO :char_var_list separated BY ' ', :num_var_list separated BY '_n '
	FROM DICTIONARY.COLUMNS
	WHERE libname="WORK" AND memname="table_complete" AND type="char";
quit;
J'obtiens cela :
Code :
1
2
 
NOTE: No rows were selected.
Peut tu au passage me commenter ton code, je ne suis pas familier à SQL.
Merci beaucoup steelspirit.
dev_grou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 16h11   #7
Membre chevronné
 
Avatar de steelspirit
 
Inscription : janvier 2008
Messages : 420
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2008
Messages : 420
Points : 739
Points : 739
Envoyer un message via MSN à steelspirit
Il faut mettre le nom de la table en MAJUSCULE. Ici je fais une requête pour récupérer la liste des variables caractères de la table et je la met dans la macro variable "char_var_list". Au passage je créé également la macro variable "num_var_list" avec '_n ' en séparateur.
steelspirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 17h14   #8
Invité de passage
 
Inscription : avril 2009
Messages : 11
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 11
Points : 2
Points : 2
@steelspirit : Ca marche, je n'ai qu'une chose à dire MERCI.

B.R.A.V.O
dev_grou 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 02h39.


 
 
 
 
Partenaires

Hébergement Web