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

  1. #1
    Membre à l'essai
    Sélection aléatoire de N observations selon critères en cascade (dans une boucle ?)
    Bonjour,

    Dans une table qui contient des individus (cf. PJ) ayant certains critères, je dois tirer 5 individus au sort (N individus selon la présence ou non de critères)

    Un individu doit toujours avoir le critère 1 le plus élevé (si pas 10, 9, sinon 8...) et le critère 2 : 2 séjours au sort maximum. Si 1 ou zéro,
    on passe à la même sélection avec le critère 2 : 2 séjours au sort maximum. Si 1 ou zéro, critère 3 etc. en cascade jusqu'à obtenir 5 individu et épuisement des critères disponibles.

    Et dans l'hypothèse maximale où aucun individu n'est trouvé avec les premiers critères, on en tire 5 à critère 1 = 0. On descend donc dans les critères jusqu'à trouver 5 individus.

    Une boucle complexe doit être la solution mais je ne vois pas comment l'écrire. J'espère avoir été clair. N'hésitez pas à me demander plus de précisions si nécessaire.

    Merci d'avance pour votre aide.

  2. #2
    Membre expérimenté
    Bonjour,
    Quel est le résultat attendu de l'exemple en pièce jointe. "Les individus qui doivent être sélectionnés selon les critères en cascade".

    Merci
    Ward

  3. #3
    Membre à l'essai
    Citation Envoyé par hossward Voir le message
    Bonjour,
    Quel est le résultat attendu de l'exemple en pièce jointe. "Les individus qui doivent être sélectionnés selon les critères en cascade".

    Merci
    Ward
    Bonjour Ward,

    5 au total;
    au maximum 2 critères 2 (avec le critère 1 le plus élevé possible) mais il peut y en avoir qu'un ou zéro. Dans ce cas on se reporte sur le crit3 (toujours avec crit 1 le plus élevé)
    au maximum 2 critères 3 (avec le critère 1 le plus élevé possible) mais il peut y en avoir qu'un ou zéro. Dans ce cas on se reporte sur le crit3 (toujours avec crit 1 le plus élevé)
    au mieux 1 crit4 (si 2 crit2 et 2 crit3) sinon, la différence ce qui n'a pas été trouvé en crit 2 et 3 (et toujours avec crit1 le plus élevé possible).

    C'est pas simple, j'en ai bien conscience !

    Merci d'avance

  4. #4
    Membre expérimenté
    Citation Envoyé par vnr66 Voir le message
    Bonjour Ward,

    5 au total;
    au maximum 2 critères 2 (avec le critère 1 le plus élevé possible) mais il peut y en avoir qu'un ou zéro. Dans ce cas on se reporte sur le crit3 (toujours avec crit 1 le plus élevé)
    au maximum 2 critères 3 (avec le critère 1 le plus élevé possible) mais il peut y en avoir qu'un ou zéro. Dans ce cas on se reporte sur le crit3 (toujours avec crit 1 le plus élevé)
    au mieux 1 crit4 (si 2 crit2 et 2 crit3) sinon, la différence ce qui n'a pas été trouvé en crit 2 et 3 (et toujours avec crit1 le plus élevé possible).

    C'est pas simple, j'en ai bien conscience !

    Merci d'avance
    Bonjour,
    Je te propose une solution correspondant à la description ci-dessus et qui donne la combinaison suivante : Individus={1, 5, 2, 6, 8} dans l'ordre de tri.

    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
    data Test ;
    input id Crit1 crit2$ Crit3$ Crit4$ ;
    cards ;
    1  10 oui non oui
    2  9  non oui non
    3  8  non non non
    4  7  non non non
    5  6  oui oui oui
    6  5  oui oui non
    7  4  oui non non
    8  3  non oui oui
    9  2  non oui non
    10 1  non non non
    11 0  oui non non
    ; run ; 
     
    data selects (keep=Individus);
    do until(fin) ;
    set Test end=fin ; 
    /*------------------*/
    array _2crit[6]  ; 
    array _3crit[11] ;
    array _4crit[11] ;
    /*------------------*/
    if crit2='oui' and cnt2 <=1 then do ; cnt2+1 ; _2crit(cnt2)=id ; end ;
    if crit3='oui'              then do ; cnt3+1 ; _3crit(cnt3)=id ; end ;
    if crit4='oui'              then do ; cnt4+1 ; _4crit(cnt4)=id ; end ;
    end ;	 
    /*------------------*/
    do until(fin) ;
    set Test end=fin ; 
    do m=1 to dim(_3crit) ; 	
    	do n=m to dim(_2crit) ; 
    		if _3crit(m) = _2crit(n) then call missing( _3crit(m)) ;  
    		if _4crit(m) = _2crit(n) then call missing( _4crit(m)) ;  
     	end ;
    end ;  
    /*------------------*/
    do p=1 to dim(_3crit) ; 	
    if not missing(_3crit(p)) and cnt <=1 then do ; cnt2+1 ; cnt+1 ; _2crit(cnt2)=_3crit(p) ; end ; 
    if not missing(_4crit(p)) and knt <=1 then do ; cnt2+1 ; knt+1 ; _2crit(cnt2)=_4crit(p) ; end ; 
    end ;  
     
    end ;
    /*------------------*/
    do q=1 to dim(_2crit) ;
    Individus=_2crit(q) ; output ;	  
    end ; 	 
    run ;

    Cordialement
    Ward

  5. #5
    Membre à l'essai
    Super, merci ! Je vais regarder tout ça.

###raw>template_hook.ano_emploi###