
Deux méthodes pour sélectionner des données en se basant sur un second data set
janvier 26, 2009Avec IF/SELECT/WHERE, OUTPUT/DELETE vous savez comment garder une partie des données disponible en fonction de la valeur de variables. Mais comment faire si les données servant de critère sont dans un autre data set ?
Voici un exemple :
- D’un côté, on a un data set SAS avec tous les effets secondaires (adverse events) de tous les patients. Un patient peut avoir plusieurs effets secondaires et donc plusieurs lignes. Il peut aussi ne pas être présent s’il aucun effect secondaire n’a été enregistré.
- De l’autre côté on a un data set contenant seulement les patients répondant aux critères du protocol d’étude clinique (une ligne par patient).
Comment garder tous les effects secondaires de ces patients valides par protocole et seulement de ceux-là ?. SAS a deux possibilités :
- un MERGE dans une étape data utilisé avec son option (IN=)
- un PROC SQL avec la condition WHERE… IN ().
Vous trouverez un rappel sur le MERGE en lisant : « La base de la jointure de deux data sets avec MERGE« .
1. Les data sets AE_MULTI et PAT_UNIQ servent d’exemple
Une ou plusieurs lignes par patients dans le data set AE_MULTI : le data set AE_MULTI contient six effets secondaires (6 lignes d’observations) se référant à 4 patients (numéros : 1, 2, 4 et 5).
data ae_multi; input patref ae_id; datalines; 1 1 1 2 2 1 4 1 4 2 5 1 ; run;
Une seule ligne par patient dans le data set PAT_UNIQ : le data set PAT_UNIQ contient trois patients (3 observations) : numéros 2, 3 et 4.
data pat_uniq; input patref; datalines; 2 3 4 ; run;
En d’autres termes, on souhaite garder les observations de AE_MULTI si et seulement si le patient est aussi enregistré dans le data set PAT_UNIQ. Trois observations sont à conserver : celles du patient 2 avec ses deux effets secondaires et celle du patient 4 avec son effet secondaire.
patref ae_id 2 1 4 1 4 2
2. Deux solutions
Dans ce cas du MERGE, on annote (flag) les données avec des variables temporaires (AE et PAT).
- Si la valeur de PATREF est présente dans le fichier AE_MULTI, alors AE=1, sinon AE=0.
- Si la valeur de PATREF est présente dans le fichier PAT_UNIQ, la variable PAT=1, sinon elle est égale à 0.
Si le patient est à la fois dans les deux data sets (si AE=1 et PAT=1), alors les données sont envoyées (ouputted) dans le data set VERSION1.
Comme se sont les variables du data set AE_MULTI qui nous intéresse et non celles du data set PAT_UNIQ, on ne garde parmi les variables de PAT_UNIQ seulement la variable PATREF servant de lien et listée dans l’instruction BY.
data version1; merge ae_multi (in=ae) pat_uniq (in=pat keep=patref); by patref; if ae and pat; run;
Avec la procédure SQL, on sélectionne toutes les données disponibles dans le data set AE_MULTI en précisant que les valeurs de la variable PATREF doit aussi être présentes dans une autre sélection, celle définie entre parenthèses.
proc sql; create table version2 as select * from ae_multi where patref in (select patref from pat_uniq); quit;
Entre les deux méthodes, on notera deux différences :
- Avec le merge, il est possible de lier des data sets ayant plus d’une variable commune (by pays centre patient;).
- Avec la procédure SQL, on peut multiplier les données dans le WHERE. Par exemple, on pourrait à la fois choisir les patients qui sont dans le data set PAT_UNIQ et exclure les effets secondaires qui sont aussi présents dans un autre fichier que AE.
Votre commentaire