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 :

Tirage aléatoire sans remise


Sujet :

Macro

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2017
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Tirage aléatoire sans remise
    Bonjour à tous,

    j'aurais besoin de votre aide sur le code ci-dessous. En effet si j'essaye de sélectionner de manière aléatoire un nombre de ligne supérieur au nombre de ligne dans la base de données le code tournera sans me donner de réponse.

    En effet si j'ai plusieurs tables et que dans chacune d'elle je souhaite tirer aléatoirement 300 lignes par exemples pour celles qui ont moins de 300 lignes le code plantera.

    Serait-il possible de dire à SAS que pour les tables dont le nombre de ligne est inférieur à 300 il faut prendre toutes la bases de données?? En gros comparer les 300 au nombre de lignes maximum dans chaque base de données si 300 < nbr de ligne max alors tirer aléatoirement sinon prendre toutes la base de données/



    Je sais pas si j'ai été assez clair.


    Merci par avance pour votre aide.

    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
    %macro tasr(libref=,entree=,sortie=,nb=); 
    data &libref..&sortie (drop=i j count); 
      count=0; 
      array obsnum(&nb) _temporary_; 
      do i=1 to &nb; 
          redo: 
          select=ceil(ranuni(12345)*n); 
          set &libref..&entree point=select nobs=n; 
             do j=1 to count; 
               if obsnum(j)=select then goto redo; 
             end; 
          position=select; 
          count=count+1; 
          obsnum(count)=select; 
          output; 
       end; 
       stop; 
       set &libref..&entree; 
    run; 
     
    %mend;

  2. #2
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut sous-table aléatoire
    Bonjour,

    Votre macro ne semble pas fournir le résultat escompté même pour les tables ayant un nombre de lignes supérieur à nb.

    Pourquoi pas simplement :

    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
    %macro tasr(libref=, entree=, sortie=, nb=); 
      data &libref..&sortie; 
        set &libref..&entree; 
        alea=ranuni(12345);
      run; 
     
      proc sort data=&libref..&sortie; 
        by alea;
      run;
     
      data &libref..&sortie; 
        set &libref..&sortie; 
        if _N_ <= &nb;
      run;
    %mend;
     
    data data1;
      do i=1 to 200;
        output;
      end;
    run;
     
    data data2;
      do i=1 to 400;
        output;
      end;
    run;
     
    %tasr(libref=work,entree=data1,sortie=data1_selec,nb=300);
    %tasr(libref=work,entree=data2,sortie=data2_selec,nb=300);
    Cordialement,

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2017
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonjour mgdondon,

    j'ai trouvé une solution qui fonctionne très bien.

    Merci pour ta réponse je la garde aussi, ça fait toujours du bien d'avoir plusieurs codes.

    Je met la solution que j'ai trouvé en bas.

    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
    %macro tasr(libref=,nbgroup=,nb=,preftabin=groupe,preftabout=PREMANDAT_);
     
    options mprint;
     
     
    %do i=1 %to &nbgroup.;
    %let nb&i=0;
     
    DATA _null_;
    SET &libref..&preftabin&i. END=eof; 
    IF eof THEN DO;
          CALL SYMPUT("nb&i.",min(&nb.,put(_N_,8.))); 
    END;
     
    run;
     
    	data &libref..&preftabout&i. (drop=i j count);
    		count=0;
    		array obsnum(&nb) _temporary_;
     
    		do i=1 to &&nb&i.;
    	redo:
    			select=ceil(ranuni(12345)*n);
    				set &libref..&preftabin&i. point=select nobs=n;
     
    				do j=1 to count;
    					if obsnum(j)=select then
    						goto redo;
    				end;
     
    				position=select;
    				count=count+1;
    				obsnum(count)=select;
    				output;
    			end;
     
    			stop;
    			set &libref..&preftabin&i.;
    	run;
    %end;
    %mend;
     
    /*PELICAN_&dat_mdt   */
    %tasr(libref=work,nbgroup=4,nb=10);

Discussions similaires

  1. [XL-2013] Tirage aléatoire sans remise avec condition
    Par Stanley1st dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 28/05/2018, 15h11
  2. Tirage aléatoire sans remise
    Par Mohammed_Z dans le forum R
    Réponses: 2
    Dernier message: 02/08/2015, 12h39
  3. Tirage aléatoire sans remise
    Par Ghadgoud dans le forum Débuter
    Réponses: 4
    Dernier message: 02/06/2015, 12h47
  4. [Sources/Macros] Tirage aléatoire sans remise : macro tasr
    Par fafabzh6 dans le forum Contribuez
    Réponses: 2
    Dernier message: 10/04/2014, 20h43
  5. Boucle tirage aléatoire sans remise
    Par Jennn dans le forum Macro
    Réponses: 17
    Dernier message: 12/07/2012, 09h17

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