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

R Discussion :

Gestion de dates


Sujet :

R

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Apprenti bioinformatique
    Inscrit en
    Mars 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Apprenti bioinformatique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2015
    Messages : 17
    Points : 35
    Points
    35
    Par défaut Gestion de dates
    Bonjour à tous,

    je fais face à un petit (?) problème qui commence à me prendre le choux :

    En gros, je dispose d'une liste d'identités, auxquelles sont associés des évènements (sous forme d'un code, mais peu importe), auxquels sont associés des dates.
    Ce qui donne sous forme d'un dico (que j'ai essayé de traiter sous perl mais je suis pas plus doué sous ce langage, l'idéal étant que je le fasse sous R), avec différents cas de figures :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    %dicomachin = (
      id1 => { event1 => date1,
    	   event2 => date2,
    	 },
      id2 => { event3 => date3,
    	 },
      id3 => { event4 => NULL,
    	 },
    );
    Ce qui sous R est sous forme d'un dataframe. Avec, en l'occurrence plein d'autres données, dont des "épisodes", tous initialisé à 1 :

    id1 event1 date1 1
    id1 event2 date2 1
    id2 event3 date3 1
    id3 event4 NULL 1

    L'idée étant que je veux classifier ces évènements en épisodes en fonction de la date.

    Ici, pour l'id1, l'idée est de déterminer quelle date est la plus ancienne, et changer l'épisode à 2 pour la date la plus récente (en sachant qu'il faudrait qu'il y ait au moins un mois d'écart entre les deux, un vrai mois d'environ 30 jours, pas juste une différence d'un mois sur la date. Si il y a 10 jours d'écart, ça reste le même épisode. La limite n'est pas défini pour l'instant, je dis un mois (presque) arbitrairement).

    Pour l'id2, pas besoin d'y toucher, puisqu'il n'y a qu'un seul event. L'épisode reste donc à 1.

    Il existe quelques cas problématiques comme l'id3 où l'event n'a pas de dates. Quand il n'y a qu'un event, pas de soucis. Mais si il y en a plusieurs sans dates pour le même id, c'est un problème, ces cas seront donc ignorés pour l'instant.

    Pour donner un ordre d'idée, j'ai environ 10000 id, pour 22000 event dont 200 n'ont pas de dates. Certains id ont jusqu'à une vingtaine d'event, mais aucun n'a pas d'event.

    Je tourne en rond, et je manque vraiment beaucoup trop de connaissance et de pratique en R pour ça j'ai l'impression .

    Calculer la différence entre deux dates, jusqu'ici, ça va. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mesdates<-function(date_i,date_j){
      difftime(strptime(df$date[date_i], format = "%Y-%m-%d"), strptime(df$date[date_j], format = "%Y-%m-%d"), units = "weeks")
    }
    Mais au-delà de ça...

    Si vous avez des pistes, des idées, je suis preneur. Merci !

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Apprenti bioinformatique
    Inscrit en
    Mars 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Apprenti bioinformatique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2015
    Messages : 17
    Points : 35
    Points
    35
    Par défaut
    Bon, finalement je me suis débrouillé avec perl (et c'était pas trop lourd en fait), sujet clos

  3. #3
    Membre averti
    Homme Profil pro
    Data Scientist
    Inscrit en
    Août 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data Scientist
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 139
    Points : 316
    Points
    316
    Par défaut
    Bonjour,

    Peux-tu tout de même donner le code de ta solution au cas où d'autres personnes auraient un problème similaire ?

    Merci

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Apprenti bioinformatique
    Inscrit en
    Mars 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Apprenti bioinformatique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2015
    Messages : 17
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    oui, bien sur, désolé de pas y avoir pensé (remarque c'est aussi parce que ce n'est pas encore au point, mais que c'est suffisant pour ce que je veux en faire pour l'instant).

    Bon, par contre comme je l'ai dit, c'est du perl, peut être faudrait-il déplacer le sujet.

    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
    use Date::Calc qw(:all);	# le package pour des fonctions sur les dates
     
    open (FHI, "table_event.csv") or die("cannot open table_event.csv");	# ma table contenant les infos que je récupère
    open (FHA, ">table_event_finale.csv") or die("cannot create table_event_finale.csv");	# la table ou je réécrirai les infos récupérée en ajoutant les épisodes 
     
     
    while ($line =  <FHI>) {	# parcourt ligne par ligne de la table
    	@line = split ("\t", $line);	# split des colonnes sur les tabulations
    	if ($line[4] == "\\N") {	# dans le cas des event n'ayant pas de dates...
    		$line[4] = '1900-01-01';	# écriture d'une date par défaut qui permettra l'incrémentation de l'épisode pour au moins le 1er event
    	}	# \N est interprété sous MySQL comme un champs NULL.
    	$id {$line[1]}{$line[0]} = $line[4];	# Création d'une table de hash id comme indiqué dans mon 1er post : l'id => (les) event => (les) date(s)
    }
     
    close FHI;
     
     
    foreach $elm (sort keys(%id)) {	# Et parcourt de la table, pour chaque identité (en triant ces id qui sont sous forme d'un code numérique)
    	$e = 0;	# initialisation de l'épisode à 0.
    	$date0 = '1900-01-01';	# création d'une chaine contenant une date par défaut, nécessaire pour le calcul de la première différence de date
     
    	foreach $event (sort keys %{$id{$elm}}) {	# Pour l'identité en cours (1ère boucle), parcourt de tous ses event
     
    		$date = $id{$elm}{$event};	# on récupère la date de l'event de la boucle en cours dans une variable
    		( $annee, $mois, $jour ) = split ('-', $date);	# split de la date récupéré, dans trois variables
    		( $annee0, $mois0, $jour0 ) = split ('-', $date0); # split de la date créée par défaut, dans trois variables
    		$diff = $annee - $annee0;	# soustraction de l'année en cours par l'année par défaut (permet de palier partiellement au problème de ce script)
     
    		$nb = Delta_Days( ( $annee0, $mois0, $jour0 ), ( $annee, $mois, $jour ) );	# calcul la différence du nombre de jours entre deux dates. La date en cours moins la date par défaut au premier tour...
    																					# aux tours suivants c'est la date en cours qui servira de date de base ($date0)
    		if($nb >=  183 || $diff >= 1 ) {	# si il y a environ 6 mois entre deux dates, ou une différence d'un an
    			$e++;			# incrémentation d'un de l'épisode, la date par défaut en 1900 permet de passer obligatoirement le 1er event à 1
    		}	
    		$date0 = $date;	# la date en cours devient la nouvelle date qui sera soustraite au tour suivant
     
    		if($id{$elm}{$event} == '1900-01-01') {	# remplacement de la date par NULL si jamais je lui avais attribué la valeur par défaut
    			$id{$elm}{$event} = "\\N\n";
    		}
     
    		print FHA ("$event\t$elm\t$e\t$_\t$id{$elm}{$event}");	# et écriture de ma nouvelle table
     
    	}
    }
     
    close FHA;
     
    print "\n";
     
    print "################\n";
    print "#   The End!   #\n";
    print "################\n";
    <>;
    Le problème avec cela c'est que la date prise pour référence est toujours celle de la boucle précédente (sauf pour la 1ère qui prend la date par défaut en 1900). Du coup, si il y a dix dates d'affilées, et qu'elles sont toutes séparées par moins de six mois, l'épisode restera à un, même si il y a 3 ans entre le 1ère et la dernière. Ce problème étant partiellement 'rustiné' avec le "ou différence d'un an au moins". C'est pas bien, reste encore trop d'épisodes qui ne s'incrémentent pas, mais je m'en satisfais pour l'instant (aka j'ai trop de truc plus urgent à faire^^).

    Faudrait juste conserver la 1ère date sur plusieurs tours de boucle, jusqu'à ce que la différence atteigne 6 mois. Ce qui pose toujours le problème pour les id ayant plein d'event tous proche dans le temps. Là, pour le coup, c'est pas le script qui pourra dire quand survient le nouvel épisode.

    (Pour contextualiser, je parle d'épisode de lymphome, dans le sens épisode 1 = diagnostic, épisode 2 = rémission, épisode 3 = rechute par exemple. Si tous les événements sont trop proche dans le temps, c'est les données cliniques qui me diront (ou pas d'ailleurs...) si nouvel épisode il y a. Pour incrémenter spécifiquement et à la main ensuite.)

    Voilà.

    Pouet.

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

Discussions similaires

  1. gestion de date de fin de mois
    Par bzh56 dans le forum Bases de données
    Réponses: 4
    Dernier message: 14/01/2005, 10h15
  2. Réponses: 3
    Dernier message: 13/08/2004, 18h52
  3. [MCD] Gestion de date
    Par Seb7 dans le forum Schéma
    Réponses: 13
    Dernier message: 08/09/2003, 09h29
  4. [MCD] [MCD] Gestion des dates
    Par brionne dans le forum Schéma
    Réponses: 3
    Dernier message: 30/05/2003, 13h01
  5. [BEST_PRACTICE][Merise] MCD & gestion de date
    Par Seb7 dans le forum Schéma
    Réponses: 4
    Dernier message: 16/04/2003, 17h07

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