DATA Step, Macro, Functions and more

Macro for dynamically assigning new values based on random numbers

Reply
Senior User
Posts: 1

Macro for dynamically assigning new values based on random numbers

Hello - I am relatively new to SAS and a first time poster. I have some code that assigns a random integer to a set of IDs. I have posted this below. Is it possible to create a new ID variable chosen by the user based on these random variables? Ive had trouble with this because the number of new IDs I want to assign inherently changes. Is there a better way to go about this?

 

data data_1;

  Input id_no;

  cards;

  123

  456

  789

  987

  654

;

run;

 

%macro assign_rand(no_rand=);

  %macro randbetween(min,max);

    (&Min + floor((1+&max-&min)*Rand("uniform)));

  %mend;

 

  data data_1;

    set data_1;

  random_no = %randbetween(1,&no_rand);

  run;

%mend;

 

Super User
Posts: 23,295

Re: Macro for dynamically assigning new values based on random numbers

Posted in reply to mike_579357

Are you looking for something along these lines?

https://gist.github.com/statgeek/fd94b0b6e78815430c1340e8c19f8644

 


mike_579357 wrote:

Hello - I am relatively new to SAS and a first time poster. I have some code that assigns a random integer to a set of IDs. I have posted this below. Is it possible to create a new ID variable chosen by the user based on these random variables? Ive had trouble with this because the number of new IDs I want to assign inherently changes. Is there a better way to go about this?

 

data data_1;

  Input id_no;

  cards;

  123

  456

  789

  987

  654

;

run;

 

%macro assign_rand(no_rand=);

  %macro randbetween(min,max);

    (&Min + floor((1+&max-&min)*Rand("uniform)));

  %mend;

 

  data data_1;

    set data_1;

  random_no = %randbetween(1,&no_rand);

  run;

%mend;

 


 

Super User
Posts: 10,689

Re: Macro for dynamically assigning new values based on random numbers

Posted in reply to mike_579357

data data_1;
  Input id_no;
  cards;
  123
  456
  789
  987
  654
;
run;


  data _null_;
    set data_1 end=last;
 if _n_=1 then call execute('data want;');
 call execute(catt('random_no=1 + floor(',id_no,'*Rand("uniform"));output;'));
 if last then call execute('run;');
  run;
Valued Guide
Posts: 653

Re: Macro for dynamically assigning new values based on random numbers

@Ksharp cool code, but would the following be a simpler approach?

  data want2;
   set data_1;
   random_no=1+floor(id_no*rand('uniform'));
   run;

Do we need to be sure that the random identifiers are unique?

Super User
Posts: 10,689

Re: Macro for dynamically assigning new values based on random numbers

@ArtC Cool !  Maybe I get confused by OP. Hope one day we could have a meet in the future.

Ask a Question
Discussion stats
  • 4 replies
  • 153 views
  • 0 likes
  • 4 in conversation