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 :

fusion des dates continues


Sujet :

SAS Base

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    octobre 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : octobre 2019
    Messages : 1
    Points : 1
    Points
    1
    Par défaut fusion des dates continues
    Bonjour,

    Je possède une liste de patients et leurs dates de prise de médicaments. Par exemple, pour le patient n°1 j'ai deux lignes Drug A, alors qu'en fait le patient n'a jamais arrêté d'en prendre. Donc au lieu d'avoir une première ligne de start=22/10/2015 - end=08/11/2015 et une seconde start=09/11/2015 - end=16/12/2015, je souhaiterais dans ma table finale n'avoir qu'une seule ligne start=22/10/2015 - end=16/12/2015. Cependant, toujours pour le patient n°1, le traitement avec Drug B n'est PAS continu (il n'a pas pris de médicament le 05/11/2015), donc pour Drug B, j'ai besoin de conserver les deux lignes.
    Pourriez-vous m'aider ? J'ai essayé avec acharnement sans succès.. Merci

    Mon tableau initial :

    patientid name date_start date_end
    1 Drug A 22.10.2015 08.11.2015
    1 Drug A 09.11.2015 16.12.2015
    1 Drug B 22.10.2015 04.11.2015
    1 Drug B 06.11.2015 .

    Tableau final que je souhaiterais obtenir :

    patientid name date_start date_end
    1 Drug A 22.10.2015 16.12.2015
    1 Drug B 22.10.2015 04.11.2015
    1 Drug B 06.11.2015 .

  2. #2
    Membre du Club
    Homme Profil pro
    Statisticien
    Inscrit en
    juillet 2019
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Statisticien
    Secteur : Service public

    Informations forums :
    Inscription : juillet 2019
    Messages : 16
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    Il doit y avoir moyen de faire plus simple, mais quelque chose dans ce goût là fonctionne ?
    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
     
    /* Jeu de donnée pour tester */
    data tableauInitial;
    input patientid name $ date_start date_end;
    informat date_start date_end DDMMYY10.;
    format date_start date_end DDMMYY10.;
    datalines;
    1 	Drug_A 	22.10.2015 	08.11.2015
    1 	Drug_A 	09.11.2015 	16.12.2015
    1	Drug_A	17.12.2015	19.12.2015
    1 	Drug_B 	22.10.2015 	04.11.2015
    1 	Drug_B 	05.11.2015 	05.11.2015
    1 	Drug_B 	07.11.2015 	09.11.2015
    1	Drug_B	10.11.2015	.
    2	Drug_A	22.10.2015	09.11.2015
    ;
    run;
     
    /* petit tri */
    proc sort data=tableauInitial out=tableauTrie;
    	by patientID name date_start date_end;
    run;
     
    /* table finale */
    data tableauSimplifie(keep= s_patientID s_name s_date_start s_date_end);
    	set tableauTrie end=eof;
    	by patientID name date_start date_end;
    	retain s_patientID s_name s_date_start s_date_end;
    	format s_date_start s_date_end DDMMYY10.;
    	if first.name then do;
    		if _n_ not eq 1 then output;
    		s_patientID = patientID;
    		s_name = name;
    		s_date_start = date_start;
    		s_date_end = date_end;
    	end;
    	else do;
    		if s_date_end = date_start - 1 then do;
    			s_date_end = date_end;
    		end;
    		else do;
    			output;
    			s_date_start = date_start;
    			s_date_end = date_end;
    		end;
    	end;
    	if eof then output;
    run;

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

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

    Informations forums :
    Inscription : juillet 2011
    Messages : 451
    Points : 1 098
    Points
    1 098
    Billets dans le blog
    13
    Par défaut
    Bonjour,
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    data test;
    input pid name $ (dt_start dt_end)(:date9.);
    format dt_start dt_end :date9.;
    cards;
    1 drugA 22oct2015 08nov2015
    1 drugA 09nov2015 16dec2015
    1 drugB 25oct2015 04nov2015
    1 drugB 06nov2016 .
    2 drugA 10oct2015 10nov2015
    2 drugA 11nov2015 12dec2015
    2 drugB 02oct2015 08nov2015
    2 drugB 07nov2016 .
    ; run;
     
     
    data test1 test2 ;
    set test;
    do until (last.pid);
    set test;
    by pid;
    if dt_start=. or dt_end=. then do;
    pid1=pid;
    name1=name;
    end;
    end;
    do until (last.pid);
    set test;
    by pid;
    if pid=pid1 and name=name1 then output test2;
     else do;
             output test1;
     end;
     end;
     run;
     
     
    proc sql;
    create table test11 as select pid, name ,min(dt_start) as dt_start format =date9., 
    max(dt_end) as dt_end format =date9. from test1
    where dt_start ne . or dt_end ne .
    group by pid , name;
    quit;
     
     
    data finale;
    set test11 test2(drop=pid1 name1);
    run;
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

Discussions similaires

  1. Touver des intervalles de dates continues
    Par fab256 dans le forum Requêtes
    Réponses: 4
    Dernier message: 05/09/2012, 17h02
  2. Manipuler des dates...
    Par Ti Jen-tsie dans le forum Langage
    Réponses: 4
    Dernier message: 26/06/2003, 12h46
  3. [MCD] [MCD] Gestion des dates
    Par brionne dans le forum Schéma
    Réponses: 3
    Dernier message: 30/05/2003, 14h01
  4. Réponses: 3
    Dernier message: 19/03/2003, 16h19
  5. Fonctions de manipulation des chaines et des dates
    Par Fares BELHAOUAS dans le forum Débuter
    Réponses: 3
    Dernier message: 09/11/2002, 23h43

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