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

SAS Base Discussion :

Séparer table SAS selon différentes valeurs d'une variable


Sujet :

SAS Base

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 7
    Par défaut Séparer table SAS selon différentes valeurs d'une variable
    Bonjour,

    Je n'arrive pas à trouver une solution à mon problème, du coup, je me tourne vers vous en espérant que quelqu'un pourra me venir en aide...

    Voici mon problème : j'ai une table SAS qui comporte un grand nombre de variables. J'aimerais pouvoir scinder ma base selon les valeurs d'une de mes variables.

    Je vais prendre un exemple, ce sera peut-être plus clair. Partons de la table suivante :
    fruits couleur
    pêche orange
    abricot orange
    cerise rouge
    fraise rouge
    ...

    J'aimerais alors scinder cette table selon les différentes valeurs de la variable couleur :
    fruits couleur
    pêche orange
    abricot orange

    et

    fruits couleur
    cerise rouge
    fraise rouge

    Ce qui me pose problème, c'est que je ne connais pas à l'avance les modalités de ma variable à scinder (variable couleur dans mon exemple).

    Alors si vous avez des idées, je suis preneuse..

    Merci d'avance !

  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 : 52
    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
    Par défaut
    en fait c'est un problème classique qui se résoud de la façon suivante :

    tu fais la liste des modalités de COULEUR via une proc FREQ ou un SELECT DISTINCT.
    Tu récupères chaque valeur dans autant de macro-variables que nécessaire via un CALL SYMPUTX.
    tu crées une boucle avec, permettant de générer autant de ELSE IF que nécessaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    data 
    %do i= 1 %to &nbcouleur ; 
    table&i
    %end;
    ;
    set masource;
    if couleur="&couleur1" then output table1;
    %do i=2 %to &nbcoouleur;
    else if couleur="&couleur&i" then output table&i;
    %end;
    run;
    Tu peux chercher sur le forum des discussions similaires.

  3. #3
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Par défaut
    Bonjour.
    Deux solutions sont possibles, aucune n'étant simple à coder.
    Soit en langage macro (attention Brice, c'est pour toi ) en collectant (CALL SYMPUTX) les valeurs possibles de couleur dans des macro-variables, puis en faisant une boucle pour chaque valeur.
    Soi en une seule étape DATA avec une table de hachage. J'ai mis un exemple à la fin de la doc "le hash expliqué à ma fille" que tu devrais trouver sur ce site ; le code complet et les explications sont en page 4.
    Bon courage.
    Olivier

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 244
    Par défaut
    Hello,

    @Olivier: super la solution des tables de hash!

    Je m'étais penché sur le problème de njacquet et j'essayais de le résoudre d'une autre manière.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    data fruits;
    	fruit='banane';
    	couleur='jaune';
    	output;
    	fruit='cerise';
    	couleur='rouge';
    	output;
    run;
     
    proc sql noprint;
    	select distinct couleur
    	into :colors separated by ' '
    	from fruits;
    quit;
    J'ai donc récupéeré les couleurs.
    Ce qui me permettra de faire le statement data jaune rouge; et de donc déclarer mes tables en output.

    Par contre je coince avec la macro.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    %macro out_colors_ds;
    	data &colors ;
    		set fruits;
    /* Je récupère la valeur de la variable couleur, que j'attacherai à l'instruction output*/
    		call symputx('c',couleur);
                              /* ca coince ici */  
    		output &c;
    	run;
    %mend;
     
    %out_colors_ds
    J'ai cru voir dans l'aide de SAS que la macro variable crée avec le call symput ne peut pas être appelée dans le même data step qui l'exécute.
    J'ai essayé avec un
    mais ça ne marche pas.

    Je suis curieux de voir si on peut modifier ma macro afin d'obtenir le résultat attendu...
    Ou s'il n'est tout simplement pas possible d'y arriver avec mon idée...

    Merci pour vos précisions.

  5. #5
    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 : 52
    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
    Par défaut
    non mais tu dois décorreller l'output de la création des macro variables.

    (à tester je l'ai tapé rapidement)

    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
    proc freq data=masource noprint order=FREQ ;
    table couleur / out=mescouleurs ;
    run;
     
    data _null_;
    set mescouleurs;
    call symputx( cats("couleur",_n_) , couleur);
    call symputx( "nbcoul", _n_);
    run;
     
    DATA 
    %do i= 1 %TO &nbcoul ; 
    &&couleur&i
    %end;
    ;
    SET masource;
    IF couleur="&couleur1" then output &couleur1;
    %do i=2 %TO &nbcoouleur;
    else IF couleur="&&couleur&i" then output &&couleur&i;
    %end;
    run;

  6. #6
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 7
    Par défaut
    Avec les tables de hachage ça a très bien marché !

    Merci beaucoup !!

  7. #7
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 244
    Par défaut
    Hello,

    Je viens de lire une petite doc SAS qui m'a fait repenser à ce problème.
    Je sais qu'il est déjà résolu mais voici encore une autre manière de faire.
    (Mais je pense que la solution d'Olivier est la meilleure)
    Ca peut peut-être servir à ceux qui liront ce topic après une recherche:
    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
    data fruits;
    	fruit='banane';
    	couleur='jaune';
    	output;
    	fruit='cerise';
    	couleur='rouge';
    	output;
    	fruit='pomme';
    	couleur='vert';
    	output;
    	fruit='poire';
    	couleur='vert';
    	output;
    run;
     
    %macro split(data=,var=);
    	proc sort data=&data(keep=&var) out=values nodupkey;
    		by &var;
    	run;
     
    	data _null_;
    		set values end=last;
    		call symputx('mavar'||left(_n_),&var);
    		if last then call symputx('count',_n_);
    	run;
     
    	data 
    		%do i=1 %to &count;
    			&&mavar&i
    		%end;
    	;
    		set &data;
     
    		select (&var);
    		%do i=1 %to &count;
    			when ("&&mavar&i") output &&mavar&i;
    		%end;
    		otherwise;
    		end;
                 run;
    %mend split;
     
    %split(data=work.fruits,var=couleur);

  8. #8
    Nouveau candidat au Club
    Homme Profil pro
    études statistiques
    Inscrit en
    Juillet 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : études statistiques
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2013
    Messages : 2
    Par défaut
    bonjour,

    pour moi la méthode macro ne fonctionne pas!
    pour créer les tables dans le data avec le %do sas me le refuse car instruction non valide en mode ouvert! grrr!!!

    comment puis-je y remédier??

    merci

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/08/2013, 19h19
  2. Réponses: 2
    Dernier message: 17/06/2009, 23h00
  3. Créations de table selon les valeurs d'une variable
    Par rocsylcanar dans le forum SAS Base
    Réponses: 9
    Dernier message: 27/05/2009, 12h22
  4. reconstituer une table sas selon un schéma
    Par nostress dans le forum SAS Base
    Réponses: 1
    Dernier message: 27/05/2008, 16h04
  5. Réponses: 3
    Dernier message: 13/12/2006, 18h05

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