Bonjour à tous,
Je souhaite généraliser un programme somme toute simple mais qui crée un indicateur sur des observations selon la condition de détection.
En détail :
J'extrait des données selon 5 conditions donc j'ai 5 tables différentes (que j'appelle E: egalite, S: soundex , D: difference, IC: inclusion, IV:inversion ).
Je vais merger ces tables et je voudrais créer un indicateur qui me permet de dire de quelles conditions est issue un individu.
L'idée ici est de générer toutes les combinaisons possibles de 1 parmi 5, 2 parmi 5, 3 parmi 5, 4 parmi 5, 5 parmi 5....ca peut vite devenir penible à écrire (j'avais tout écrit pour 4...mais on a rajouté une condition donc je suis pas à l'abri d'une autre augmentation).
Donc je me demandais si quelqu'un connaissait un algorithme / macro permettant de générer toutes les combinaisons et qui me permettrait de générer mes conditions et mon indicateur (j'ai vu qu'il existe une fonction ALLCOMB mais je sais pas par quel bout l'utiliser).
Voici mon code avec l'esprit de ce que je voudrais généraliser :
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89 /*CRÉATION DE L'INDICATEUR QUI SOULIGNE LA CONDITION DE DÉTECTION*/ data CDT_CLIPOT_DREAP (keep=NO_SEQ_CLI_BEN CDT_DETECTION); length SOURCE_CDT $20.; merge F_CLIPOT_EGAL (in=a) F_CLIPOT_SOUNDEX (in=b) F_CLIPOT_DIFFERENCE(in=c) F_CLIPOT_INCLUSION(in=d) F_CLIPOT_INVERSION(in=e); by no_seq_cli_ben ; attrib cdt_detection length=$15.; /* création de l'indicateur d'origine*/ /* détecter par toutes les conditions : 1 cas */ if a and b and c and d and e then do; cdt_detection="E_S_D_IC_IC" ; end; /* détecter par 4 des conditions : 5 cas*/ else if a and b and c and d and not e then do; cdt_detection="E_S_D_IC"; end; else if a and b and c and e and not d then do; cdt_detection="E_S_D_IV"; end; else if a and b and d and e and not c then do; cdt_detection="E_S_IC_IV"; end; else if a and c and d and e and not b then do; cdt_detection="E_D_IC_IV" ; end; else if b and c and d and e and not a then do; cdt_detection="S_D_IC_IV" ; end; /* détecter par 3 des conditions : 10 cas*/ if a and b and c and not d and not e then do; cdt_detection="E_S_D" ; end; if a and c and d and not b and not e then do; cdt_detection="E_S_IC"; end; /*****A CONTINUER: 10 cas en tous ******/ /* détecter par deux des conditions*/ if a and b and not c and not d and not e then do; cdt_detection="E_S" ; end; if a and c and not b and not d and e then do; cdt_detection="E_D"; end; /******************A CONTINUER : 10 cas en tous*******/ /*Cas uniquement par une condition : 5*/ else if a and not b and not c and not d and not e then do; cdt_detection="E" ; end; else if b and not a and not c and not d and not e then do; cdt_detection="S" ; end; else if c and not a and not b and not d and not e then do; cdt_detection="D" ; end; else if d and not a and not b and not c and not e then do; cdt_detection="IC" ; end; else if e and not a and not b and not c and not d then do; cdt_detection="IV" ; end; run;
Je pense qu'il existe surement une methode plus condensée pour faire cela.
Merci d'avane.
Partager