Combiner différentes bases de données...

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Oriane Moyne
Messages : 17
Enregistré le : 20 Oct 2015, 15:50

Combiner différentes bases de données...

Messagepar Oriane Moyne » 23 Nov 2015, 13:20

Bonjour à tous,

Alors, voici mon problème :

J'ai deux bases de données de santé :

- La première contient des informations concernant des prélèvement effectués chez des patients (identifiant patient, date du prélèvement, résultats de tests...). Dans cette data.frame, une ligne correspond à un prélèvement, et il peut y avoir plusieurs prélèvements par patient.

- La deuxième contient des informations sur certains patients (exemple : patients décédés et dates de décès).

L'avantage, c'est que les identifiants patient des deux bases de données correspondent.

Code : Tout sélectionner

> inter<-intersect(data2$identifiant, as.character(data1$Id_Patient))

tableau2<-data2[data2$identifiant%in%inter,]
head(tableau2[,c(1,46)], 10)
    identifiant    date.DC
173      172 09/08/2011
99        98 18/05/2005
151      150 01/05/2010
201      200 04/05/2013
160      159 30/11/2010
144      143 10/12/2009
176      175 06/09/2011
159      158 12/11/2010
140      139 18/09/2009
155      154 22/09/2010


Donc je voudrais, lorsqu'un patient présent dans data1 apparait dans data2 (via son identifiant), exporter l'information "DCD" ainsi que la date de décès.

Code : Tout sélectionner

data1$DCD<-ifelse(data1$Id_Patient%in%tableau2$identifiant, "oui", NA)

Pas de problème

J'ai tenté ça :

Code : Tout sélectionner

data1$date_DC<-ifelse(data1$Id_Patient%in%tableau2$identifiant, as.character(tableau2$date.DC), NA)

C'est là que ça coince, toutes les dates se mélangent !

Extrait (la colonne de droite correspond au nombre de prélèvements par patient) :

Code : Tout sélectionner

> data1[60:70, c(34, 38:40)]
       Id_Patient DCD    date_DC    tot_prel
6.554        6   <NA>        <NA>        4
6.1036       6   <NA>        <NA>        4
6.1091       6   <NA>        <NA>        4
7.7          7   <NA>        <NA>        2
7.555        7   <NA>        <NA>        2
9.37         9    oui  12/11/2010       12
9.38         9    oui  18/09/2009       12
9.69         9    oui  22/09/2010       12
9.71         9    oui  28/10/2012       12
9.133        9    oui  30/03/2011       12
9.200        9    oui  09/08/2011       12


On voit que pour le patient 9, la date ne reste pas fixe par rapport à la date trouvée dans data2.

J'ai aussi tenté ça :

Code : Tout sélectionner

for (i in 1: nrow(tableau2)){
  for (j in 1: nrow(data1)){
    while(tableau2$identifiant[i]==data1$Id_Patient[j]){
      data1$date_DC[j]<-repeat(as.character(tableau2$date.DC[i]))
    }
  }
}


Mais la boucle pédale et ne se termine jamais...

Quelqu'un a-t-il une idée ?

Merci de votre aide !

Florent Aubry
Messages : 324
Enregistré le : 25 Juin 2010, 10:21

Re: Combiner différentes bases de données...

Messagepar Florent Aubry » 23 Nov 2015, 13:38

La fonction merge répond à ton problème.

Oriane Moyne
Messages : 17
Enregistré le : 20 Oct 2015, 15:50

Re: Combiner différentes bases de données...

Messagepar Oriane Moyne » 23 Nov 2015, 17:35

Merci beaucoup, je n'y avais pas pensé... Je voyais cela comme un import de données et non une fusion !

J'ai fait comme ça (pour ceux à qui cela pourrait servir) :

Code : Tout sélectionner

tableau3<-tableau2[,c(104,46,96,99)] ##les données qui m'intéressent dans tableau2
data1.2<-merge(data1, tableau3, by.x = "Id_Patient", by.y = "identifiant", all=TRUE)

Florent Aubry
Messages : 324
Enregistré le : 25 Juin 2010, 10:21

Re: Combiner différentes bases de données...

Messagepar Florent Aubry » 23 Nov 2015, 18:50

Code : Tout sélectionner

data1.2 <- merge( data1, tableau2[,c(104,46,96,99)], by.x = "Id_Patient", by.y = "identifiant", all=TRUE)


marche tout aussi bien sans avoir à passer par une variable intermédiaire.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité