Dans le traitement de données cliniques ou transactionnelles, il est fréquent de rencontrer des doublons "imparfaits". Un cas classique est celui où un événement (comme un traitement médical) est enregistré deux fois : une fois à la date de début et une fois le jour suivant, créant ainsi deux observations pour un même événement.
Cet article explore comment nettoyer un jeu de données où chaque observation est répétée sur deux jours consécutifs, avec pour objectif de supprimer la première observation (la date la plus ancienne) et de ne conserver que la seconde (la date la plus récente).
Le Problème
Imaginons un jeu de données contenant les variables id, group et treatmentdate. Chaque traitement s'étend sur deux jours consécutifs, générant deux lignes. De plus, un même identifiant (id) peut avoir plusieurs épisodes de traitement distincts dans le temps au sein du même groupe.
Exemple de données brutes :
| id | group | treatmentdate | Note |
| A1 | 0 | 30Sep2017 | À supprimer |
| A1 | 0 | 01Oct2017 | À garder |
| A2 | 1 | 06Nov2017 | À supprimer |
| A2 | 1 | 07Nov2017 | À garder |
| A1 | 0 | 23Oct2017 | À supprimer (Nouvel épisode pour A1) |
| A1 | 0 | 24Oct2017 | À garder |
Une approche naïve utilisant PROC SQL avec un GROUP BY id, group et MAX(day) échouerait ici, car elle écraserait la distinction entre les différents épisodes de traitement (par exemple, pour A1, elle ne garderait que le 24 octobre et perdrait le 1er octobre).
La Solution Optimale
La méthode la plus robuste repose sur l'utilisation du DATA Step combiné à un tri intelligent (PROC SORT). L'idée est d'utiliser la fonction DIF pour comparer les dates entre les lignes, tout en protégeant les changements de groupes.
Étape 1 : Le Tri (PROC SORT)
L'astuce consiste à trier les données par ordre décroissant de date. En mettant la date la plus récente en premier, nous transformons le problème : au lieu de "chercher la ligne suivante pour voir si c'est la même", nous pouvons simplement comparer la ligne actuelle à la précédente.
