1. #1
    Candidat au Club
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    février 2018
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Analyse données médicales
    Secteur : Santé

    Informations forums :
    Inscription : février 2018
    Messages : 16
    Points : 3
    Points
    3

    Par défaut Identifier une ligne qui précède directement une ligne selon un critère dans une table

    Bonjour,

    Dans le cadre d'une étude sur des séjours de patients qui se suivent, je dois identifier une séquence précise : les patients passés par un établissement précis avant d'avoir un séjour avec un critère "dépose". Anonyme est le patient (clé), ano_date la variable de rang des séjours (ordre temporel). Je dois identifier la ligne chu=1 et depose=0 quand la ligne qui suit directement (ano_date) est chu=0 et dépose=1. Sachant qu'avant chu=0 et depose=1, je peux avoir rien ou chu=0 et depose=0.

    Je ne sais pas trop comment procéder en étape data.

    Si quelqu'un a la solution, ça m'aiderait énormément !

    Merci d'avance

    Vnr

    Nom : table sas.PNG
Affichages : 47
Taille : 17,6 Ko

  2. #2
    Membre éprouvé
    Homme Profil pro
    Statisticien/développeur BI
    Inscrit en
    janvier 2012
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Statisticien/développeur BI
    Secteur : Transports

    Informations forums :
    Inscription : janvier 2012
    Messages : 316
    Points : 1 109
    Points
    1 109

    Par défaut

    Bonjour,

    En triant la table en ordre inverse avant le traitement ?

    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 test;
    input ano ano_date chu depose;
    cards;
    1 24309 1 0
    1 24384 0 1
    2 27026 1 0
    2 27040 1 0
    2 27050 0 0
    2 27068 0 1
    2 27105 1 0
    ;
    run;
     
    proc sort data=test;
    by ano descending ano_date ;
    run;
     
    data test (drop=temp);
    set test;
    retain temp;
    by ano;
    if first.ano then temp = 0;
    if chu=0 and depose=1 then temp = 1;
    if chu=1 and depose = 0 and temp=1 then do;
    	flag=1;
    	temp=0;
    end;
    run;
     
    proc sort data=test;
    by ano ano_date;
    run;

  3. #3
    Candidat au Club
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    février 2018
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Analyse données médicales
    Secteur : Santé

    Informations forums :
    Inscription : février 2018
    Messages : 16
    Points : 3
    Points
    3

    Par défaut

    Bonjour Edward,

    Merci de ta proposition. Je teste ça cet après-midi et te tiens au courant.

    Encore merci

    Vnr

  4. #4
    Candidat au Club
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    février 2018
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Analyse données médicales
    Secteur : Santé

    Informations forums :
    Inscription : février 2018
    Messages : 16
    Points : 3
    Points
    3

    Par défaut

    ça semble fonctionner ! Comment ferais-tu pour mettre un flag=2 sur la ligne chu=0 et depose=1 qui suit ? Car, je dois transposer ensuite ces deux lignes avec l'information ano_date

  5. #5
    Candidat au Club
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    février 2018
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Analyse données médicales
    Secteur : Santé

    Informations forums :
    Inscription : février 2018
    Messages : 16
    Points : 3
    Points
    3

    Par défaut

    En fait, ça fonctionne en partie,

    Dans le cas de ce patient, la colonne "sel" montre ce que j'attends comme rt. La ligne 357 étant ano-date 27851, elle devrait apparaître juste avant la 358 ano_date 27854.Hors, c'est la ligne 359 qui apparaît première de la séquence (la colonne "del" indique que la ligne 359 est n°3 dans la séquence de ces lignes).

    Une idée ? Je sèche.

    Nom : captret.PNG
Affichages : 34
Taille : 20,3 Ko

  6. #6
    Membre éprouvé
    Homme Profil pro
    Statisticien/développeur BI
    Inscrit en
    janvier 2012
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Statisticien/développeur BI
    Secteur : Transports

    Informations forums :
    Inscription : janvier 2012
    Messages : 316
    Points : 1 109
    Points
    1 109

    Par défaut

    Forcément, si il y a des doublons dans ano_date ça ne va pas fonctionner ....

    Quelles sont tes données sources ? la colonne del existe t'elle à la source ? (ce qui permettrait de trier correctement la table)
    Comment est calculée ano_rank ? ( j'ai l'impression que c'est une moyenne du rank en cas de date identique ...)

  7. #7
    Candidat au Club
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    février 2018
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Analyse données médicales
    Secteur : Santé

    Informations forums :
    Inscription : février 2018
    Messages : 16
    Points : 3
    Points
    3

    Par défaut

    Bonjour,

    Oui, del existe dès le départ, j'aurais du le mentionner, et correspond à la date de fin du séjour. Oui, le rang est calculé avec proc rank et les chiffres avec décimales identiques apparaissent donc quand ano_date est en double (deux séjours le même jour pou un patient).

    Merci à toi.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Statisticien/développeur BI
    Inscrit en
    janvier 2012
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Statisticien/développeur BI
    Secteur : Transports

    Informations forums :
    Inscription : janvier 2012
    Messages : 316
    Points : 1 109
    Points
    1 109

    Par défaut

    Ok, donc il suffit juste d'ajouter un tri de la table par "ano_date" puis par "del" (et retrier dans le sens inverse après traitement)

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    data test;
    input id ano ano_date del chu depose;
    cards;
    10 1 24309 24309 1 0
    11 1 24384 24384 0 1
    12 2 27026 27026 1 0
    13 2 27040 27040 1 0
    14 2 27050 27050 0 0
    15 2 27068 27068 0 1
    16 2 27105 27105 1 0
    17 2 27120 27120 0 1
    354 3 27799 27799 1 0
    355 3 27829 27896 1 0
    356 3 27847 27850 1 0
    357 3 27851 27851 1 0
    358 3 27854 27854 0 1
    359 3 27854 27855 1 0
    360 3 27856 27856 1 0
    361 3 27857 27857 1 0
    ;
    run;
     
    proc sort data=test;
    by ano descending ano_date descending del;
    run;
     
    data test (drop=temp);
    set test;
    retain temp;
    by ano;
    if first.ano then temp = 0;
    if chu=0 and depose=1 then temp = 1;
    if chu=1 and depose = 0 and temp=1 then do;
    	flag=1;
    	temp=0;
    end;
    run;
     
    proc sort data=test;
    by ano ano_date del; 
    run;
     
    data test (drop=temp);
    set test;
    retain temp;
    by ano;
    if first.ano then temp = 0;
    if flag=1 then temp = 1;
    if chu=0 and depose = 1 and temp=1 then do;
    	flag=2;
    	temp=0;
    end;
    run;
    A tester, j'ai fait ça rapidement en live ...

  9. #9
    Candidat au Club
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    février 2018
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Analyse données médicales
    Secteur : Santé

    Informations forums :
    Inscription : février 2018
    Messages : 16
    Points : 3
    Points
    3

    Par défaut

    Ok, je vais tester tout ça et te tient au courant. Et merci du temps passé, c'est très sympa de ta part !

  10. #10
    Candidat au Club
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    février 2018
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Analyse données médicales
    Secteur : Santé

    Informations forums :
    Inscription : février 2018
    Messages : 16
    Points : 3
    Points
    3

    Par défaut

    Alors, j'ai rajouté une autre variable de tri pour distinguer les lignes en doublon date car del pouvait être également en doublon. Il y a juste une chose que j'ai du mal à comprendre dans ce code, pourquoi utiliser : if first.ano then temp=0 sachant que la table est trié en odre déchrono et que chu=0 et depose =1 peut se trouver sur la dernière ligne d'un groupe d'ano (même si la suite du prog remet bien temp à 1 si chu=0 et depose=1) ? c'est pour lui indiquer où commencer dans le group by ?

    J'ai encore pas mal de choses à apprendre sur la fonction retain qui semble très utile.

    Encore merci à toi.

  11. #11
    Candidat au Club
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    février 2018
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Analyse données médicales
    Secteur : Santé

    Informations forums :
    Inscription : février 2018
    Messages : 16
    Points : 3
    Points
    3

    Par défaut

    Et si je veux noter le flag de la séquence contiguë à 2 en même temps ? J'arrive à le faire dans une autre étape data avec un autre flag mais pas dans une seule étape avec la même variable. Merci

  12. #12
    Membre confirmé
    Homme Profil pro
    Consultant Finance/Assurance
    Inscrit en
    décembre 2013
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant Finance/Assurance

    Informations forums :
    Inscription : décembre 2013
    Messages : 160
    Points : 604
    Points
    604

    Par défaut

    Bonjour,

    Personnellement je n'aurais pas pensé à trier en marche arrière pour ensuite re-trier en marche avant et re faire l'exercice.

    En attendant que Edward te réponde pour compléter son code, je propose une autre approche qui permet de flaguer à 2 en une étape :

    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
    data test;
    input id ano ano_date del chu depose;
    format ano_date del ddmmyy10.;
    cards;
    10 1 24309 24309 1 0
    11 1 24384 24384 0 1
    12 2 27026 27026 1 0
    13 2 27040 27040 1 0
    14 2 27050 27050 0 0
    15 2 27068 27068 0 1
    16 2 27105 27105 1 0
    17 2 27120 27120 0 1
    354 3 27799 27799 1 0
    355 3 27829 27896 1 0
    356 3 27847 27850 1 0
    357 3 27851 27851 1 0
    358 3 27854 27854 0 1
    359 3 27854 27855 1 0
    360 3 27856 27856 1 0
    361 3 27857 27857 1 0
    ;
    run;
     
    proc sort data=test;
    by ano ano_date del;
    run;
     
    Data analyse;
    Set test;
    By ano;
    If first.ano or flag = 2 then flag = 0;
    If (CHU = 1 and depose = 0) and flag ne 1 then flag + 1;
    Else if (CHU = 0 and depose = 1) then flag + 1;
    Run;
    Flo00154

  13. #13
    Candidat au Club
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    février 2018
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Analyse données médicales
    Secteur : Santé

    Informations forums :
    Inscription : février 2018
    Messages : 16
    Points : 3
    Points
    3

    Par défaut

    Bonjour Flo00154,

    Merci de ta solution, je vais tester ça. Vous m'aidez bien à avancer en tous les cas, merci.

  14. #14
    Candidat au Club
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    février 2018
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Analyse données médicales
    Secteur : Santé

    Informations forums :
    Inscription : février 2018
    Messages : 16
    Points : 3
    Points
    3

    Par défaut

    J'ai testé et ça donne ça, ça met bien le flag à deux mais il demeure des 1 partout au lieu de juste sur la séquence qui précède chu=0 et depose=1(variable sel=attendu).

    Nom : captret1.PNG
Affichages : 18
Taille : 38,6 Ko

Discussions similaires

  1. Réponses: 11
    Dernier message: 14/06/2018, 14h34
  2. Réponses: 11
    Dernier message: 08/06/2017, 11h15
  3. Réponses: 12
    Dernier message: 20/03/2015, 10h27
  4. [XL-2010] Copier plage de cellules vers une autre feuille selon un critère dans une boucle
    Par klash384 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/01/2015, 17h53
  5. Réponses: 10
    Dernier message: 23/11/2009, 22h49

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