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 :

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


Sujet :

SAS Base

  1. #1
    Membre à l'essai
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    Février 2018
    Messages
    30
    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 : 30
    Points : 14
    Points
    14
    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 : 286
Taille : 17,6 Ko

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 326
    Points : 1 142
    Points
    1 142
    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
    Membre à l'essai
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    Février 2018
    Messages
    30
    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 : 30
    Points : 14
    Points
    14
    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
    Membre à l'essai
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    Février 2018
    Messages
    30
    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 : 30
    Points : 14
    Points
    14
    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
    Membre à l'essai
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    Février 2018
    Messages
    30
    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 : 30
    Points : 14
    Points
    14
    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 : 234
Taille : 20,3 Ko

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 326
    Points : 1 142
    Points
    1 142
    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
    Membre à l'essai
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    Février 2018
    Messages
    30
    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 : 30
    Points : 14
    Points
    14
    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
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 326
    Points : 1 142
    Points
    1 142
    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
    Membre à l'essai
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    Février 2018
    Messages
    30
    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 : 30
    Points : 14
    Points
    14
    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
    Membre à l'essai
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    Février 2018
    Messages
    30
    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 : 30
    Points : 14
    Points
    14
    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
    Membre à l'essai
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    Février 2018
    Messages
    30
    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 : 30
    Points : 14
    Points
    14
    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
    198
    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 : 198
    Points : 638
    Points
    638
    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
    Membre à l'essai
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    Février 2018
    Messages
    30
    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 : 30
    Points : 14
    Points
    14
    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
    Membre à l'essai
    Homme Profil pro
    Analyse données médicales
    Inscrit en
    Février 2018
    Messages
    30
    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 : 30
    Points : 14
    Points
    14
    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 : 214
Taille : 38,6 Ko

Discussions similaires

  1. Réponses: 14
    Dernier message: 25/10/2018, 09h52
  2. Réponses: 11
    Dernier message: 14/06/2018, 14h34
  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