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

  1. #1
    Membre régulier
    Inscrit en
    juillet 2009
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 147
    Points : 73
    Points
    73

    Par défaut Optimiser l'ajout de variables

    Bonjour,

    Je souhaite ajouter dans une table autant de variables qu'il y a de modalités d'une autre variable déjà présente dans la table.

    Par exemple, ma table contient la variable var1 qui a comme modalités 2,151,172.
    J'aimerais donc rajouter 3 variables, et les nommer selon les modalités : newvar2, newvar151, newvar172.

    Et petit plus, mettre newvar151 à 1 lorsque var1 vaut 151 par exemple.

    Voici le début de code que j'ai construit, mais je bloque et doute que ce soit la meilleure façon de faire ou la plus optimisée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    proc sql noprint;
    select distinct nomenc into: lst_nom separated by ',' from opti_bcl;
    quit;
     
    data _null_;
    call symputx('nbnom', count("&lst_nom",',') + 1);
    run;
    ...puis faire un alter table ou autre ?

    La première proc sql me semble être le meilleur départ car je peux avoir [245,62] comme modalité, et il faudra en déduire et créer deux variables : newvar245 et newvar62.

    Merci beaucoup de votre aide !

  2. #2
    Membre régulier
    Inscrit en
    juillet 2009
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 147
    Points : 73
    Points
    73

    Par défaut

    Je me permet un UP de cette discussion car malgré plusieurs tentatives, je ne trouve pas de solutions satisfaisantes...
    J'ai testé en passant par un array, par une proc transpose, ... mais rien de satisfaisant niveau optimisation.

    Si quelqu'un a une piste, une idée à creuser...

    Rappel du problème de base :
    J'ai une variable TMP qui a comme modalité 2,17,51,24, et j'aimerais en déduire 4 nouvelles variables var2, var17, var51, var24 qui valent respectivement 1 selon la modalité de TMP.

    Encore merci.

  3. #3
    Membre éclairé
    Inscrit en
    novembre 2009
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 414
    Points : 802
    Points
    802

    Par défaut Transposition

    Bonjour,

    Une proposition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    data test;
      input var1;
      cards;
    2
    17
    51
    24
    2
    ;
    run;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    data test;
      set test;
      N=_N_;
      var2=1;
    run;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    proc transpose data=test out=transpose(drop=_NAME_) prefix=pref;
      var var2;
      id var1;
      by N var1;
    run;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    N    var1    pref2    pref17    pref51    pref24
    1      2       1         .         .         .
    2     17       .         1         .         .
    3     51       .         .         1         .
    4     24       .         .         .         1
    5      2       1         .         .         .
    Cordialement,

  4. #4
    Membre régulier
    Inscrit en
    juillet 2009
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 147
    Points : 73
    Points
    73

    Par défaut

    Je vais essayer ça de ce pas !!
    Il ma manquait certainement le N = _N_ pour faire fonctionner correctement ma proc transpose...

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    janvier 2013
    Messages
    430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : janvier 2013
    Messages : 430
    Points : 1 427
    Points
    1 427

    Par défaut

    Bonjour,
    Si je comprends bien, tu veux dichotomiser la Var1 en ses modalités. Si celle-ci se trouve dans une table avec d’autres variables je te propose le code suivant à modifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    proc Sql ;
    select distinct(age) as modage, 
    	cat('newvar', modage, '= ifn(age=', modage, ', 1' , ', 0 )' )
    into : mod1-:mod99, :listmodas separated by '; ' 
    from sashelp.class ;  
    quit ;    
     
    data AgeEnModas ;
    set  sashelp.class ; 
    &listmodas. ;
    run ;
    Bon Courage
    Ward

  6. #6
    Membre régulier
    Inscrit en
    juillet 2009
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 147
    Points : 73
    Points
    73

    Par défaut

    Merci à vous deux !
    Les deux solutions conduisent vers le résultat escompté et dans des performance de temps d'exécution plus que raisonnable.

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

Discussions similaires

  1. ajouter une variable à une chaine
    Par youtou dans le forum C
    Réponses: 11
    Dernier message: 06/06/2006, 16h11
  2. Réponses: 1
    Dernier message: 30/03/2006, 08h19
  3. ajouter une variable sur un control
    Par gijy dans le forum MFC
    Réponses: 15
    Dernier message: 21/03/2006, 19h18
  4. Ajouter des variables au PATH
    Par Feustine dans le forum Langage
    Réponses: 5
    Dernier message: 16/08/2005, 14h59
  5. Réponses: 12
    Dernier message: 26/02/2003, 09h14

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