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 :

Fonctions sur variables caractères


Sujet :

SAS Base

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2008
    Messages : 35
    Points : 36
    Points
    36
    Par défaut Fonctions sur variables caractères
    Bonjour voici mon problème :
    je souhaiterais transformer une variable (par ex Q776) qui contient n modalités (séparées par un point virgule) en n variables qui prendraient la valeur 0 si absente de la variable Q776 ou 1 si présente.

    A l'aide d'un array je crée mes n variables binaires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    array Q776a[6] Q7761-Q7766;
     
    label
    Q7761 = "Je n'ai pas le temps "
    Q7762 = "Ca coûte cher"
    Q7763 = "Je n'ai pas la clientèle pour "
    Q7764 = "Je ne me suis jamais posé la question "
    Q7765 = "Ce n'est pas mon travail "
    Q7766 = "Ce n'est pas légal : problème AMM "
    ;
    Maintenant comment "traduire" cette variable Q776 (un peu comme la fonction convertir dans Excel avec la largeur fixe égale au ";")

    Pour vous éclairer un peu, voici ce que je souhaiterais :
    quand Q776 = 2521 alors je voudrais que la Q7761=1 et les 5 autres =0.
    quand Q776=2522;2526 alors je voudrais que la Q7762 =1 et la Q7766 =1 et les 4 autres =0.

    Auriez-vous une idée?

    Merci d'avance pour votre réponse.
    Images attachées Images attachées  

  2. #2
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Bonjour,

    avec la fonction scan de sas tu vas pouvoir explorer ta variable, cependant tu parle de "n" modalités.

    Dans ton exemple tu as une variable de la forme

    QXXXI=YYYI1;YYYI2;YYYI3

    que tu veux transformer en QXXXI1='0' ou '1' , QXXXI2='0' ou '1'

    dans le cas précis de QXXXI=YYYI1;YYYI2;YYYI3

    tu veux

    QXXXI1='1'
    QXXXI2='1'
    QXXXI3='1'
    et QXXXI='0' pour I différent de I1;I2;I3

    ici avec I allant de 1 à 9 par exemple

    Si ta variable a plus de 9 modalités comment ça se passe ?

  3. #3
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    voici un code qui fonctionne pour les données de ton screen

    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
     
    data table; set _null_;
    data table;
    length obs $4. q775 $50.;
    obs='1';Q776='';output;
    obs='2';Q776='';output;
    obs='3';Q776='2521';output;
    obs='4';Q776='2521;2523';output;
    obs='5';Q776='2522;2523;2525';output;
    obs='6';Q776='2521;2522;2523;2524;2525;2526';output;
    obs='7';Q776='';output;
    obs='8';Q776='2522;2526';output;
    obs='9';Q776='';output;
    run;
     
     
     
    data table_2;
    set table;
    array Q776a[6] Q7761-Q7766;
    do i=1 to 6;
    if scan(q776,i,';')^='' then Q776a(substr(scan(q776,i,';'),4,1))='1';
    end;
    do i=1 to 6;
    if Q776a(i)^='1' then Q776a(i)='0';end;
    drop i;
    run;
    Edit : Le code est perfectible biensûr selon l'état de propreté de ta variable.
    Par exemple si les modalité sont bien classées dans l'ordre on pourrait fusionner les deux boucles do;end; en faisant attention au test.
    Par contre ce code coincera dès que tu auras plus de 9 modalités ou plutôt des modalités codées sur plus d'un caractère.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2008
    Messages : 35
    Points : 36
    Points
    36
    Par défaut Merci !
    Merci Jérôme, je n'avais pas vu que tu avais répondu.

    En fait j'ai trouvé la solution (et en regardant vite fait je pense que cela ressemble à ce que tu préconisais). Voilà mon code (pour rappel, ma variable d'origine traitée s'appelle Q776. Elle contient de 1 à 6 modalités séparées par des ";" et ces modalités vont de 2521 à 2526):

    data nomtab;
    set nomtab;
    array Q776a[6] Q7761-Q7766;/* déclaration de nouvelles colonnes/variables : ici 6 , et qui s'appellent Q7761 à Q7766*/
    label /* déclaration des labels pour ces nouvelles variables*/
    Q7761 = "Je n'ai pas le temps "
    Q7762 = "Ca coûte cher"
    Q7763 = "Je n'ai pas la clientèle pour "
    Q7764 = "Je ne me suis jamais posé la question "
    Q7765 = "Ce n'est pas mon travail "
    Q7766= "Ce n'est pas légal : problème AMM "
    ;

    if Q776 not in ("") then do;/*si la variable qui contient toutes les modalités n'est pas vide alors... */
    do i=1 to 6; /* ... on procède de même pour les 6 variables créées : Q7761 à Q7766*/
    Q776a[i]=0; /* D'abord les 6 variables sont mises à 0*/
    if index(trim(left(Q776)),trim(left(2520+i)))>0 then Q776a[i]=1;/* Si l'index retourne une valeur alors la variable correspondante à la modalité trouvée prendra la valeur 1*/
    end;
    end;

    run;
    /* Détails sur :
    if index(trim(left(Q776)),trim(left(2520+i)))>0 then Q776a[i]=1;

    Index : dans une variable définie (ici Q776), on va regarder si un caractère/nombre particulier est présent (ici 2520+i qui correspond à 2521,2522...2526).
    Si ce caractère est trouvé alors l'index retournera la position (ce sera donc un nombre) de ce caractère dans la variable d'origine, sinon il indiquera 0).
    Trim(left) indique que l'on ne tient pas compte des blancs dans les chaînes de caractère.

    Au final cette ligne de code veut donc dire (par ex pour la modalité 2521) :
    si l'index qui "scanne" la variable Q776 (pour trouver la modalité= 2521)
    renvoie une valeur supérieure à 0 (il a donc trouvé la modalité) alors la variable nouvellement crée et qui se nomme Q7761 prend la valeur 1.
    */

    Ce bout de code pourra peut être servir à qqun !
    Et si vous pensez qu'il peut être optimisé, n'hésitez pas !

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

Discussions similaires

  1. Tri sur variable caractère
    Par julbisounours dans le forum Débutez
    Réponses: 4
    Dernier message: 13/08/2012, 13h24
  2. Pb avec les fonctions sur les chaines de caractères.
    Par arnold95 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/04/2008, 19h09
  3. MDX fonction sur chaine de caractères (concat(),Substring())
    Par YagamiRaito dans le forum Mondrian
    Réponses: 2
    Dernier message: 16/08/2007, 17h16
  4. Fonction sur chaine de caractère (ASCII)
    Par Medmidou dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 25/05/2007, 01h40

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