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

SAS Discussion :

Tirage aléatoire sans remise


Sujet :

SAS

  1. #1
    Nouveau Candidat au Club
    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 éprouvé
    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
    Nouveau Candidat au Club
    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);

###raw>template_hook.ano_emploi###