Problème complexe de dédoublonnage sans perte d'information

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

Philippe Pes
Messages : 5
Enregistré le : 05 Déc 2021, 00:08

Problème complexe de dédoublonnage sans perte d'information

Messagepar Philippe Pes » 16 Avr 2022, 16:46

Bonjour,

Je suis assez newbe dans R, j'ai un problème sur lequel je butte depuis plusieurs semaines. Je pense ne pas l'aborder sous le bon angle à cause de ma mauvaise connaissance de R et de sa philosophie.
J'ai commencé a le "couper" en problèmes plus petit mais voici où je coince :
--
Le contexte : J'ai un dataframe dont je ne contrôle pas la génération (il s'agit d'un fichier tableur issue d'une requête BO sur une base de données hospitalière.

La structure de ce dataframe est comme ci-dessous :
-----

Code : Tout sélectionner

df <- structure(list(DRM = c(2000222L, 2000222L, 2000255L, 2000310L,
2000310L, 2000504L, 2000666L, 2000666L, 2000666L, 2000300L, 2000800L,
2000805L, 2000805L, 2000812L, 2000812L), NOM = c("Patient_1",
"Patient_1", "Patient_2", "Patient_3", "Patient_4", "Patient_5",
"Patient_6", "Patient_6", "Patient_7", "Patient_8", "Patient_9",
"Patient_10", "Patient_10", "Patient_11", "Patient_11"), PRENOM = c("Mathieu",
"Mathieu", "Berthe", "Albert", "Fanny", "Eric", "Elise", "Elise",
"X", "Marc", "Mathieu", "Idriss", "Idriss", "Philippe", "Philippe"
), SEXE = c("M", "M", "F", "M", "F", "M", "F", "F", "M", "M",
"M", "M", "M", "M", "M"), AGE = c("65 A", "65 A", "88 A", "3 A",
"27 A", "25 A", NA, "33 A", "55 A", "75 A", "12 A", "32 A", "32 A",
"59 A", "59 A"), DEVENIR = c("URG2", "URG2", "MG1", "URG3", "URG3",
"URG3", "URG2", "URG2", "URG2", "URG2", "URG2", "URG3", "URG3",
"MG2", "MG2"), DECISION = c("VSAV1", "SMUR NANTES", "AP1", "VSAV1",
"VSAV2", "SOS", "VSAV3", "SMUR", "VSAV4", "VSAV5", "AP2", "CM",
"CM", "CM", "CM"), DEVENIR_PATIENT = c("LSP", "LSP", "URGENCE_ST_NAZ",
"URGENCE_NANTES", "URGENCE_NANTES", "LSP", "BLOC_PTMC", "BLOC_PTMC",
"DCD_LSP", "URGENCE_CTB", "URGENCE_PEDIATRIQUE_NANTES", "LSP",
"LSP", "PROPRE MOYEN", "PROPRE MOYEN"), HDR = c("Céphalées",
"Céphalées", "Douleur thoracique", "Trauma", "Trauma", "Psychiatrie",
"Polytrauma", "Polytrauma", "Polytrauma", "Dyspnée", NA, "Psychiatrie",
"Psychiatrie", "Urologie", "Urologie"), BILAN = c("Migraine",
"HSA", "Angoisse", "fracture bras", "TC sans PDC", NA, "TC grave",
"Fémur", "ACR", "Covid", NA, "Angoisse", NA, "Rétention Urine",
"Rétention Urine")), class = "data.frame", row.names = c(NA,
-15L))

-----
On a un numéro "DRM" (Dossier de Régulation Médicale) qui représente une intervention.
On voit qu'il y a des doublons, qui peuvent être "vrai"
Exemple ligne 14 et 15 ou toute la ligne est identique (Cas N°1)

Des lignes ou on a des doublons (même DRM et même patient) MAIS dont certaines colonnes sont différentes : exemple ligne 7 et 8 avec même patient mais DECISION différentes, et Bilan différent. (Cas N°2)

Enfin, dans un même DRM je peux avoir 2 patients différents (combiné aux cas N°2 aussi...)

Mon besoin :
Je veux éliminer les vrais doublon : cas N°1 ... ça j'ai trouvé avec la fonction Distinct de Dplyr.

Je voudrais pouvoir détecter les cas N°2 et récupérer les informations différentes (comme la ligne 7 et 8 colonne DECISION) dans une colonne que j'ajoute à la première ligne...
Exemple pour les ligne 7 et 8 : créer une colonne DECISION_1 contenant l'info de la ligne 7 (VSAV) et une colonne DECISION_2 contenant la DECISION de la ligne 8 (SMUR).
PUIS, effacer la ligne en trop ...(ici la 8)

Et bien entendu j'aimerais ne pas mélanger les lignes ayant même DRM mais pas le même patient... (cas N°3)...

Je vous remercie déjà d'avoir lu mon message jusqu'ici...
J'espère que c'est suffisamment clair et comprhéensible
En vous remerciant pour toute piste !
Philippe

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Problème complexe de dédoublonnage sans perte d'information

Messagepar Mickael Canouil » 18 Avr 2022, 09:02

Bonjour,

unique() pour les vrais doublons.
Et un peu de concaténation des variables pour les autres cas par DRM/patient.

Code : Tout sélectionner

library("dplyr")
library("tidyr")
unique(df) %>%
  group_by(DRM, NOM, PRENOM, SEXE, AGE) %>%
  summarise(across(.fns = paste, collapse = ";")) %>%
  ungroup() %>%
  separate(
    col = DECISION,
    into = paste0("DECISION_", 1:2),
    sep = ";",
    fill = "right"
  )
#> `summarise()` has grouped output by 'DRM', 'NOM', 'PRENOM', 'SEXE'. You can
#> override using the `.groups` argument.
#> # A tibble: 12 × 11
#>       DRM NOM   PRENOM SEXE  AGE   DEVENIR DECISION_1 DECISION_2 DEVENIR_PATIENT
#>     <int> <chr> <chr>  <chr> <chr> <chr>   <chr>      <chr>      <chr>          
#>  1 2.00e6 Pati… Mathi… M     65 A  URG2;U… VSAV1      SMUR NANT… LSP;LSP        
#>  2 2.00e6 Pati… Berthe F     88 A  MG1     AP1        <NA>       URGENCE_ST_NAZ 
#>  3 2.00e6 Pati… Marc   M     75 A  URG2    VSAV5      <NA>       URGENCE_CTB    
#>  4 2.00e6 Pati… Albert M     3 A   URG3    VSAV1      <NA>       URGENCE_NANTES 
#>  5 2.00e6 Pati… Fanny  F     27 A  URG3    VSAV2      <NA>       URGENCE_NANTES 
#>  6 2.00e6 Pati… Eric   M     25 A  URG3    SOS        <NA>       LSP            
#>  7 2.00e6 Pati… Elise  F     33 A  URG2    SMUR       <NA>       BLOC_PTMC      
#>  8 2.00e6 Pati… Elise  F     <NA>  URG2    VSAV3      <NA>       BLOC_PTMC      
#>  9 2.00e6 Pati… X      M     55 A  URG2    VSAV4      <NA>       DCD_LSP        
#> 10 2.00e6 Pati… Mathi… M     12 A  URG2    AP2        <NA>       URGENCE_PEDIAT…
#> 11 2.00e6 Pati… Idriss M     32 A  URG3;U… CM         CM         LSP;LSP        
#> 12 2.00e6 Pati… Phili… M     59 A  MG2     CM         <NA>       PROPRE MOYEN   
#> # … with 2 more variables: HDR <chr>, BILAN <chr>   


Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Philippe Pes
Messages : 5
Enregistré le : 05 Déc 2021, 00:08

Re: Problème complexe de dédoublonnage sans perte d'information

Messagepar Philippe Pes » 05 Mai 2022, 15:17

Bonjour Mickael,

Tout d'abord un gros gros merci car vous m'avez mis sur la bonne piste !!
En fait mon DF est plus complexe que l'exemple mais grâce à vous j'ai compris le principe et ça fonctionne.
Je m'excuse juste de mon délai de réponse, je ne voudrais pas passer pour un impoli qui sait pas remercier mais j'ai eu quelques "obligations" qui m'ont imposé de ne pouvoir revenir et surtout tester la solution plus tôt.
Bref, encore une fois, merci beaucoup et à bientôt car je débute sur R et j'aurais certainement un tas d'autres questions
Bien Cordialement
Philippe Pès


Retourner vers « Questions en cours »

Qui est en ligne

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