IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macro Discussion :

Générer toutes les combinaisons de lettre pour créer des conditions (IF..THEN..)


Sujet :

Macro

  1. #1
    Membre actif
    Femme Profil pro
    Analyste en Intelligence d'Affaires (BI)
    Inscrit en
    Avril 2008
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste en Intelligence d'Affaires (BI)
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 245
    Points : 290
    Points
    290
    Par défaut Générer toutes les combinaisons de lettre pour créer des conditions (IF..THEN..)
    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.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Points : 181
    Points
    181
    Par défaut
    Bonjour,

    L'exemple ci dessous répond il à ta question?

    Cordialement,

    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
    data A;
    input X $ nb_a $;
    cards;
    C01 A
    C02 A
    C03 A
    ;
    run;
    data B;
    input X $ nb_b $;
    cards;
    C01 B
    C03 B
    ;
    run;
    data C;
    input X $ nb_c $;
    cards;
    C01 C
    ;
    run;
     
    data all;
        merge A(in=a) B(in=b) C(in=c);
    by X;
    detection = compbl(nb_a !! " " !! nb_b !! " " !! " " !! nb_c);
    run;

  3. #3
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour Mariam.
    Je crois qu'il y a eu un topic il n'y a pas trop longtemps sur un sujet voisin de création de combinaisons / arrangements / permutations.
    Je chercherais du côté de la proc PLAN, tu peux t'en servir comme mot-clé de recherche sur le forum.
    Bon courage.
    Olivier

  4. #4
    Membre actif
    Femme Profil pro
    Analyste en Intelligence d'Affaires (BI)
    Inscrit en
    Avril 2008
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste en Intelligence d'Affaires (BI)
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 245
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    merci de cette réponse d'après les tests que je viens de faire cette solution semble faire l'affaire. d'une grande facilité en plus


    Merci beaucoup.

  5. #5
    Membre actif
    Femme Profil pro
    Analyste en Intelligence d'Affaires (BI)
    Inscrit en
    Avril 2008
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste en Intelligence d'Affaires (BI)
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 245
    Points : 290
    Points
    290
    Par défaut
    Citation Envoyé par olivier.decourt Voir le message
    Bonjour Mariam.
    Je crois qu'il y a eu un topic il n'y a pas trop longtemps sur un sujet voisin de création de combinaisons / arrangements / permutations.
    Je chercherais du côté de la proc PLAN, tu peux t'en servir comme mot-clé de recherche sur le forum.
    Bonjour Olivier,

    J'avais vu cette discussion d'où ma prise de connaissance avec la fonction ALLCOMB.
    Mes objectifs différent du contexte de ce post.

    La solution précédente marche, donc je vais pas aller plus loin (feignasse) !

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 07/06/2013, 11h42
  2. Réponses: 0
    Dernier message: 04/02/2013, 13h03
  3. Générer toutes les combinaisons d'une suite
    Par man_coef dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/04/2008, 18h56
  4. Réponses: 16
    Dernier message: 20/10/2006, 16h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo