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 25/11/2010, 17h13   #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 Recomposition de dates contenant des valeurs manquantes

Bonjour,

Je suis débutant en SAS et les macros, je ne maitrise pas encore ...
Je vais vous exposer mon problème, merci de m'éclaircir.
J'ai un ensemble de données (à peu près 1000 variables). Parmi ces variables, certaines serviront à la création de date (avec l'instruction mdy).
Le problème est que j'ai des variables qui ont la valeur 00 (date indéterminé) : cela peut être le jour, le mois ou les deux. Les variables jour/mois/année se suivent dans la base. Je voudrais donc pouvoir extraire ces variables de la base pour corriger les valeurs.
Sachant, que je ne compte pas parcourir toutes les variables avec la condition "if", je me demandais s'il y avait un autre moyen ?
Je mets un exemple pour mieux comprendre.

N t1 t2 t3 t4 t5 t6 t7
1 O O 00 00 1931 F G
2 N O 12 09 1900 R X
3 O N 15 01 2000 M X
4 O O 00 12 1956 J X
5 N N 19 02 2007 P X



Je voudrais avoir la date à partir de t3-t5
Pour N = 1 et 4, cela ne sera pas possible ...
Je donc voudrais avoir les variables dans une autre table SAS pour les corriger.


Merci pour vos idées.
Bien à vous.
dev_grou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 17h47   #2
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
Hello,

Je suis pas sûr d'avoir tout bien compris mais je me lance

Citation:
Le problème est que j'ai des variables qui ont la valeur 00 (date indéterminé) : cela peut être le jour, le mois ou les deux. Les variables jour/mois/année se suivent dans la base. Je voudrais donc pouvoir extraire ces variables de la base pour corriger les valeurs.
Sachant, que je ne compte pas parcourir toutes les variables avec la condition "if", je me demandais s'il y avait un autre moyen ?
Tu ne veux pas utiliser un if et tu as besoin de sortir les variables qui sont égales à 0.

Voici un petit bout de code qui pourra t'aider:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
/*Création d'un table test
2 champs N et t3
*/
DATA test;
	input @1 N 1. @3 t3 2.;
datalines;
1 00
2 12
3 15
4 00
5 19
;
run;
 
/*Création de la table de sortie avec les valeurs extraites (seulement si  t3=0) */
DATA out;
	SET test (WHERE= (t3=0));
run;
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 18h10   #3
Invité
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Bonjour; tu peux remplacer tes valeurs au même temps que la lecture de ton fichier texte; essaie d'adapter sa ; bien entendu il y a aussi des solutions avec array et autres...;

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
DATA a;
 
format dat mmddyy10.;
 INFILE 'c:\fic.txt' firstobs=1;
 
input N $ t1 $ t2 $  t3  t4   t5  t6 $  t7 $;
;
IF t4<=0 then t4=01; /*je remplace les ZERO par 01*/
IF t3<=0 then t3=01; /*je remplace les ZERO par 01*/
dat= mdy (t4, t3,t5);
 
run;


Citation:
Envoyé par dev_grou Voir le message
Hello,
Je voudrais donc pouvoir extraire ces variables de la base pour corriger les valeurs.

  Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 21h51   #4
Invité de passage
 
Inscription : avril 2009
Messages : 11
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 11
Points : 2
Points : 2
Merci tout d'abord pour vos réponses.

Je n'ai peut être pas été clair.
Le problème est que j'ai 1136 variables.

@L0007 : je ne peux pas utiliser cette condition en vérifiant 1136 variables. Je veux justement éviter cela.
@rosesansepines : j'ai donné les premières variables en exemple, dans ce cas ci, c'est possible. Mais comment faire pour toutes les variables suivantes ? t8-t1136 ?

Merci à vous
dev_grou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 08h58   #5
Membre éprouvé
 
Homme Rémi Bousquet
responsable adjoint service stat
Inscription : mars 2009
Messages : 334
Détails du profil
Informations personnelles :
Nom : Homme Rémi Bousquet
Âge : 35
Localisation : France

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

Informations forums :
Inscription : mars 2009
Messages : 334
Points : 464
Points : 464
Peut être une solution avec les vecteurs?
Ci-dessous un exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DATA test ;
    input t1 $ t2 $   t3 t4 t5   t6 $ t7 $  t8 t9 t10 ;
    cards ;
    O O 00 00 1931 F G 00 00 1931 
    N O 12 09 1900 R X 12 09 1900 
    O N 15 01 2000 M X 15 01 2000 
    O O 00 12 1956 J X 00 12 1956 
    N N 19 02 2007 P X 19 02 2007 
    ;
run ;
 
DATA test2 ;
    SET test ;
    array var_a_retraiter{*}  t3 t4   t8 t9  ;
    do loop_on_array = 1 TO dim(var_a_retraiter) ;
        IF var_a_retraiter(loop_on_array) = 00 then var_a_retraiter(loop_on_array) = 01 ;
    end ; 
run ;
A savoir, en fonction de tes données, que tu peux faire un array par exemple sur t3-t1136, ou sur _NUMERIC_.
Le tout est de trouver la façon la plus pertinente de ne faire tes retraitements que sur la bonne liste de variable à retraiter.
RemiBousquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2010, 14h08   #6
Invité de passage
 
Inscription : avril 2009
Messages : 11
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 11
Points : 2
Points : 2
Merci RemiBousquet, ca m'aide pas mal ce genre de syntaxe.

Par contre, comment faire pour stocker cela dans une autre base.

J'ai essayé sur mon jeu de données cette syntaxe ... mais aie aie aie

Code :
1
2
3
4
5
6
7
8
 
DATA test2 ;
    SET test ;
    array var_a_retraiter{*}  t3 t4   t8 t9  ;
    do loop_on_array = 1 TO dim(var_a_retraiter) ;
        IF var_a_retraiter(loop_on_array) = 00 then output;
    end ; 
run ;
En tout cas, j'ai déjà la 1re partie et c'est super. Merci
dev_grou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2010, 16h23   #7
Membre éprouvé
 
Homme Rémi Bousquet
responsable adjoint service stat
Inscription : mars 2009
Messages : 334
Détails du profil
Informations personnelles :
Nom : Homme Rémi Bousquet
Âge : 35
Localisation : France

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

Informations forums :
Inscription : mars 2009
Messages : 334
Points : 464
Points : 464
Qu'entends tu par "stoker dans une autre base de donnée",
Et en quoi cette syntaxe est difficile sur ton jeu de donnée ?
RemiBousquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2011, 11h54   #8
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 953
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 : 953
Points : 1 364
Points : 1 364
Remi etait presque au résultat voulu.
Si tu veux changer tous les 00 par 01 sur les variables t3,t4 et t5. Si jamais tu veux remplacer plusieurs variables que t3-t4, tu rajoute dans ma macro variable (ou passer par un proc contents).
Voici le code:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
%LET var_replace=t3 t4 t5 ;/* liste des variables à remplacer les 00 par 01*/
 
DATA test2 ;
    SET test ;
	ATTRIB DATE FORMAT=DDMMYY10.;
    ARRAY var_a_retraiter[*] &var_replace. ;
    DO loop_on_array = 1 TO dim(var_a_retraiter) ;
        IF var_a_retraiter(loop_on_array) = 00 THEN var_a_retraiter(loop_on_array)=01;
		date=mdy(t4,t3,t5);
 
    END ; 
	DROP loop_on_array;
RUN ;
MEGAMIND2 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 19h24.


 
 
 
 
Partenaires

Hébergement Web