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 :

Créer une variable en fonction de la valeur d'autres observations [DATA]


Sujet :

SAS Base

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Créer une variable en fonction de la valeur d'autres observations
    Bonjour,

    J'ai un problème assez simple je pense mais sur lequel je ne vois pas comment procéder en SAS (je suis débutant...)

    J'ai un dataset avec les données suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    id_ref	num_evt	cod_evt
    ref1	1	ARR
    ref1	2	BEE
    ref1	3	CDD
    ref2	1	ARR
    ref2	2	OOO
    ref2	3	BEE
    ref2	4	CDD
    ref3	1	CDD
    ref3	2	ARR
    ref3	3	BEE
    ref3	4	ARR
    Pour chaque id_ref j'ai les événements avec un numéro (num_evt) et un code événement (cod_evt)

    Le cod_evt peut prendre 4 valeurs différentes : ARR, BEE, CDD, OOO

    Je voudrai sur chaque ligne ajouter une variable que indique si oui ou non il y a un événement OOO sur cet id_ref

    Dans l'exemple, sur la ref2 a une événement OOO, donc on met le "top_ooo" à 1 pour toutes les lignes de cette ref.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    id_ref	num_evt	cod_evt	top_ooo
    ref1	1	ARR	0
    ref1	2	BEE	0
    ref1	3	CDD	0
    ref2	1	ARR	1
    ref2	2	OOO	1
    ref2	3	BEE	1
    ref2	4	CDD	1
    ref3	1	CDD	0
    ref3	2	ARR	0
    ref3	3	BEE	0
    ref3	4	ARR	0
    Merci d'avance pour votre aide !

  2. #2
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 625
    Points : 3 403
    Points
    3 403
    Par défaut
    Hello,

    Voici un exemple :
    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
     
    data exemple;
    input id_ref $4. num_evt cod_evt $3.;
    cards;
    ref1 1 ARR
    ref1 2 BEE
    ref1 3 CDD
    ref2 1 ARR
    ref2 2 OOO
    ref2 3 BEE
    ref2 4 CDD
    ref3 1 CDD
    ref3 2 ARR
    ref3 3 BEE
    ref3 4 ARR
    ;
    run;
     
    proc sort;
    by id_ref  descending cod_evt ;
    run;
     
    data exemple1;
    set exemple;
    retain top_ooo;
    by id_ref;
    if first.id_ref and cod_evt='OOO' then top_ooo=1 ;else if first.id_ref and cod_evt ne 'OOO' then  top_ooo=0;
    run;

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    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 : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour,
    C’est une solution générale dans le cas où la variable cod_evt peut prendre une modalité ZEE au lieu de BEE. Dans cet exemple on n’a pas besoin de trier la table par cod_evt et garder la table dans son état initial.
    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
    data exemple;
    input id_ref $4. num_evt cod_evt $3.;
    cards;
    ref1 1 ARR
    ref1 2 BEE
    ref1 3 CDD
    ref2 1 ARR
    ref2 2 OOO
    ref2 3 ZEE
    ref2 4 CDD
    ref3 1 CDD
    ref3 2 ARR	
    ref3 3 BEE
    ref3 4 ARR
    ;
    run;	
    
    data exemple1;	 
     top_ooo=0;
     do until (last.id_ref);
      set exemple;	  
      by id_ref notsorted;
      if cod_evt='OOO' then top_ooo=1;
     end;
    
      do until (last.id_ref);
      set exemple;
      by id_ref notsorted;
      output;
     end;
    run;
    Ward

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci pour l'exemple avec le retain je ne connaissais pas !

    Mais en fait je me suis trompé, l'événement peut aussi être un "VDD" donc le trie desc ne met plus le "OOO" en premier, je me suis arrangeait en bidouillant et en créant une autre variable avec les même valeur sauf que je renomme les OOO en ZOO.

    Mais pour ma culture, il y a une autre solution plus "propre" ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Oups, j'avais pas vu la dernière réponse de hossward, ça correspond justement à ma demande, je vais tester

    Edit : Parfait ça fonctionne, Merci !

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Suite de mon problème :

    J'ai par exemple ce jeux de donnée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ID_REF	COD_EVT	NUM_EVT
    ref1	VDD	5
    ref1	ARR	4
    ref1	OOO	3
    ref1	OOO	2
    ref1	ARR	1
    ref2	…	…
    ref2	…	…
    ref2	…	…
    ref2	…	…
    Je veux "topper" la première ligne avec un COD_EVT='ARR' ET qui précède la ligne avec un COD_EVT='OOO'

    J'ai réussi à la faire SAUF si comme dans mon exemple, il y a deux COD_EVT='OOO' pour un même ID_REF, dans ce cas je me base sur le dernier 'OOO' et donc je ne top pas la bonne ligne...

    Le code que j'utilise, d’abord j'ai créé la variable NUM_EVT_AVANT_OOO avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if COD_EVT='OOO' then NUM_EVT_AVANT_OOO=compteur_evt-1;
    Ensuite, j'ai créé la variable TOP_EVT_A_TESTER grâce a un "do until..." comme dans l'exemple qu'on m'a donnée ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    data evt_complet;	 
     do until (last.ID_REF);
      set evt_complet;	  
      by ID_REF notsorted;
      if NUM_EVT_AVANT_OOO>-1 then TOP_EVT_A_TESTER=NUM_EVT_AVANT_OOO;
     end;
     
      do until (last.ID_REF);
      set evt_complet;
      by ID_REF notsorted;
      output;
     end;
    run;
    Ensuite je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if NUM_EVT=TOP_EVT_A_TESTER then TOP_EVT_AVANT_OOO=1;
    Donc finalement ça fonctionne bien... SAUF si j'ai deux COD_EVT 'OOO' sur une même ID_REF comme dans les données d'exemple.
    Au final j'ai le TOP_EVT_AVANT_OCT qui est a 1 sur le premier 'OOO' avec que je le voudrais sur le premier 'ARR' (la dernière ligne) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ID_REF	COD_EVT	NUM_EVT	NUM_EVT_AVANT_OOO	TOP_EVT_A_TESTER	TOP_EVT_AVANT_OCT
    ref1	VDD	5	.	2	.
    ref1	ARR	4	.	2	.
    ref1	OOO	3	2	2	.
    ref1	OOO	2	1	2	1
    ref1	ARR	1	.	2	.

    Je tourne en rond depuis ce matin à essayer de modifier le if du "do until" pour rajouter une condition mais ça ne fonctionne pas. Quelqu'un pour me donner une piste ?

    Merci d'avance !

  7. #7
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    Je veux "topper" la première ligne avec un COD_EVT='ARR' ET qui précède la ligne avec un COD_EVT='OOO'
    Je te propose cette solution

    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 exemple;
    input id_ref $4. num_evt cod_evt $3.;
    cards;
    ref1 1 ARR
    ref1 2 OOO
    ref1 3 OOO
    ref2 1 ARR
    ref2 2 OOO
    ref2 3 OOO
    ref2 4 ARR
    ref3 1 CDD
    ref3 2 ARR	
    ref3 3 OOO
    ref3 4 ARR
    ;
    run;	
     
     
     
    data exemple1 (drop=next_cod_evt) ;
      set exemple end=eof ;
      next=_n_+1;
      if not eof then set Exemple (keep=cod_evt rename=(cod_evt=next_cod_evt )) point=next;
      else call missing(next_cod_evt);
    if   cod_evt="ARR" and next_cod_evt="OOO" then top=1;
    run;
    Cordialement

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    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 : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    C'est également faisable avec firstobs=2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    data exemple_1;
       set exemple end=fin ;
       by id_ref;
       if not fin then set exemple(firstobs=2 keep=cod_evt rename=(cod_evt=temp));  
       if not last.id_ref and cod_evt="ARR" and temp="OOO" then top=1;
       drop temp ;	  
    run;
    Hoss

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Ça fonctionne bien, merci !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/10/2013, 14h12
  2. Réponses: 1
    Dernier message: 01/08/2013, 12h17
  3. Réponses: 7
    Dernier message: 20/02/2012, 09h01
  4. Réponses: 13
    Dernier message: 07/11/2011, 15h41

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