%MACRO UTLRSEL ( UTITLE=RANDOMLY SELECT M OF N OBS, UOBJ=UTLRSEL, /*-------------------------------------*\ ! INPUTS ! \*-------------------------------------*/ UWANT=22, /* NUMBER OF OBS UWANTED */ UAVAIL=100, /* NUMBER OF OBS IN INPUT */ /*-------------------------------------*\ ! PROCESS ! \*-------------------------------------*/ USEED=577731, /* SAME SEED SAME OBS */ /*-------------------------------------*\ ! OUTPUT ( USER DEFINED DATA STEP VAR ! \*-------------------------------------*/ UKEEPIT=KEEPER /* 0/1 FLAG 1-KEEP 0-DELETE */ ) / DES = "RANDOMLY SELECT M OF N OBS"; /*----------------------------------------------*\ ! ! ! CODE BY ROGER DEANGELIS ! ! ! ! COMPUCRAFT INC ! ! 49 SPACKENKILL RD ! ! POUGHKEEPSIE, NY 12603 ! ! ! ! OFFICE 914-463-2770 ! ! FAX 914-462-7595 ! ! ! ! EMAIL XLR82SAS@AOL.COM ! ! ! ! USERS ARE FREE TO DO WHATEVER THEY WANT ! ! WITH ANY OR ALL OF THIS CODE. ! ! ! ! COMPUCRAFT IS NOT RESPONSIBLE FOR ANY ! ! PROBLEMS ASSOCIATED WITH THIS CODE. ! ! ! ! USE AT YOUR OWN RISK ! ! ! \*----------------------------------------------*/ /*-------------------------------------*\ ! ! ! SYSINDEX IS NUMBER OF MACROS EXECUTED ! ! ! ! ALLOWS MUTIPLE CALLS WITHIN THE SAME ! ! DATASTEP ! ! ! ! THIS CODE DOES NOT CREATE ANY GLOBAL ! ! MACRO VARIABLES OR CREATE ANY ! ! PERMANENT SAS VARIABLES. IT DOES ! ! USE 2 TEMPOARARY ARRAYS OF ONE ! ! ELEMENT EACH ! ! ! ! UTLRS1&SYSINDEX - COUNT SELECTED ! ! UTLRS2&SYSINDEX - AVAILABLE ! ! ! ! SYSINDEX IS INCREMENTED EACH TIME ! ! MACRO IS EXECUTED ( TEXT INSERTION) ! ! ! ! IE IF YOU CALL IT TWICE YOU GET TWO ! ! SETS OF COUNTERS WILL BE DEFINED ! ! ! ! ! \*-------------------------------------*/ ARRAY UTLRS1&SYSINDEX(1) _TEMPORARY_ ( &UWANT ); /* KEEP TRACK OF UKEEPIT COUNT */ ARRAY UTLRS2&SYSINDEX(1) _TEMPORARY_ ( &UAVAIL ); /* KEEP TRACK OF EXAMINED OBS */ /*-------------------------------------*\ ! ! ! AS THE NUMBER OF OBS LEFT DECREASES ! ! THE PROBABILITY OF SELECTING THE ! ! NEXT OB GOES UP. ! ! ! \*-------------------------------------*/ IF UNIFORM(&USEED) LE UTLRS1&SYSINDEX(1)/UTLRS2&SYSINDEX(1) THEN DO; UTLRS1&SYSINDEX(1) + (-1); /* DECREMENT UWANT BECAUSE WE GOT ONE */ &UKEEPIT = 1 ; /* SELECTED OBSERVARION */ END; ELSE &UKEEPIT = 0; /* NON SEKECTED OBSERVATION */ UTLRS2&SYSINDEX(1) + (-1); /* DECREMENT AVAILABLE */ %MEND UTLRSEL; DATA ALLDATA ( LABEL="SAMPLE DATA" ); DO I=1 TO 50; OUTPUT; END; RUN; DATA SET1 ( LABEL="RANDOM SET OF 49 OF 50 OBS" ) SET2 ( LABEL="RANDOM SET OF 1 OF 50 OBS" ) ; SET ALLDATA; %UTLRSEL(UWANT=49,UAVAIL=50,UKEEPIT=KEEPER); PUT @1 KEEPER= _N_=; IF KEEPER THEN OUTPUT SET1; %UTLRSEL(UWANT=1,UAVAIL=50,UKEEPIT=KEEPER); PUT @40 KEEPER= _N_=; IF KEEPER THEN OUTPUT SET2; RUN; /* THE LOG 104 105 DATA ALLDATA; 106 107 DO I=1 TO 50; 108 109 OUTPUT; 110 111 END; 112 113 RUN; NOTE: The data set WORK.ALLDATA has 50 observations and 1 variables. NOTE: The DATA statement used 0.38 seconds. 114 115 116 DATA SET1 SET2; 117 118 SET ALLDATA; 119 120 121 %UTLRSEL(UWANT=49,UAVAIL=50,UKEEPIT=KEEPER); MLOGIC(UTLRSEL): Beginning execution. MLOGIC(UTLRSEL): Parameter UWANT has value 49 MLOGIC(UTLRSEL): Parameter UAVAIL has value 50 MLOGIC(UTLRSEL): Parameter UKEEPIT has value KEEPER MLOGIC(UTLRSEL): Parameter UTITLE has value RANDOMLY SELECT M OF N OBS MLOGIC(UTLRSEL): Parameter UOBJ has value UTLRSEL MLOGIC(UTLRSEL): Parameter USEED has value 577731 SYMBOLGEN: Macro variable SYSINDEX resolves to 3 SYMBOLGEN: Macro variable UWANT resolves to 49 MPRINT(UTLRSEL): ARRAY UTLRS13(1) _TEMPORARY_ ( 49 ); SYMBOLGEN: Macro variable SYSINDEX resolves to 3 SYMBOLGEN: Macro variable UAVAIL resolves to 50 MPRINT(UTLRSEL): ARRAY UTLRS23(1) _TEMPORARY_ ( 50 ); SYMBOLGEN: Macro variable USEED resolves to 577731 SYMBOLGEN: Macro variable SYSINDEX resolves to 3 SYMBOLGEN: Macro variable SYSINDEX resolves to 3 MPRINT(UTLRSEL): IF UNIFORM(577731) LE UTLRS13(1)/UTLRS23(1) THEN DO; SYMBOLGEN: Macro variable SYSINDEX resolves to 3 MPRINT(UTLRSEL): UTLRS13(1) + (-1); SYMBOLGEN: Macro variable UKEEPIT resolves to KEEPER MPRINT(UTLRSEL): KEEPER = 1 ; MPRINT(UTLRSEL): END; SYMBOLGEN: Macro variable UKEEPIT resolves to KEEPER MPRINT(UTLRSEL): ELSE KEEPER = 0; SYMBOLGEN: Macro variable SYSINDEX resolves to 3 MPRINT(UTLRSEL): UTLRS23(1) + (-1); MLOGIC(UTLRSEL): Ending execution. 122 123 PUT @1 KEEPER= _N_=; 124 125 IF KEEPER THEN OUTPUT SET1; 126 127 128 129 %UTLRSEL(UWANT=1,UAVAIL=50,UKEEPIT=KEEPER); MLOGIC(UTLRSEL): Beginning execution. MLOGIC(UTLRSEL): Parameter UWANT has value 1 MLOGIC(UTLRSEL): Parameter UAVAIL has value 50 MLOGIC(UTLRSEL): Parameter UKEEPIT has value KEEPER MLOGIC(UTLRSEL): Parameter UTITLE has value RANDOMLY SELECT M OF N OBS MLOGIC(UTLRSEL): Parameter UOBJ has value UTLRSEL MLOGIC(UTLRSEL): Parameter USEED has value 577731 SYMBOLGEN: Macro variable SYSINDEX resolves to 4 SYMBOLGEN: Macro variable UWANT resolves to 1 MPRINT(UTLRSEL): ARRAY UTLRS14(1) _TEMPORARY_ ( 1 ); SYMBOLGEN: Macro variable SYSINDEX resolves to 4 SYMBOLGEN: Macro variable UAVAIL resolves to 50 MPRINT(UTLRSEL): ARRAY UTLRS24(1) _TEMPORARY_ ( 50 ); SYMBOLGEN: Macro variable USEED resolves to 577731 SYMBOLGEN: Macro variable SYSINDEX resolves to 4 SYMBOLGEN: Macro variable SYSINDEX resolves to 4 MPRINT(UTLRSEL): IF UNIFORM(577731) LE UTLRS14(1)/UTLRS24(1) THEN DO; SYMBOLGEN: Macro variable SYSINDEX resolves to 4 MPRINT(UTLRSEL): UTLRS14(1) + (-1); SYMBOLGEN: Macro variable UKEEPIT resolves to KEEPER MPRINT(UTLRSEL): KEEPER = 1 ; MPRINT(UTLRSEL): END; SYMBOLGEN: Macro variable UKEEPIT resolves to KEEPER MPRINT(UTLRSEL): ELSE KEEPER = 0; SYMBOLGEN: Macro variable SYSINDEX resolves to 4 MPRINT(UTLRSEL): UTLRS24(1) + (-1); MLOGIC(UTLRSEL): Ending execution. 130 131 PUT @40 KEEPER= _N_=; 132 133 IF KEEPER THEN OUTPUT SET2; 134 135 RUN; KEEPER=1 _N_=1 KEEPER=0 _N_=1 KEEPER=1 _N_=2 KEEPER=0 _N_=2 KEEPER=1 _N_=3 KEEPER=0 _N_=3 KEEPER=1 _N_=4 KEEPER=0 _N_=4 KEEPER=1 _N_=5 KEEPER=0 _N_=5 KEEPER=1 _N_=6 KEEPER=0 _N_=6 KEEPER=1 _N_=7 KEEPER=0 _N_=7 KEEPER=1 _N_=8 KEEPER=0 _N_=8 KEEPER=1 _N_=9 KEEPER=0 _N_=9 KEEPER=1 _N_=10 KEEPER=0 _N_=10 KEEPER=1 _N_=11 KEEPER=0 _N_=11 KEEPER=1 _N_=12 KEEPER=0 _N_=12 KEEPER=1 _N_=13 KEEPER=0 _N_=13 KEEPER=1 _N_=14 KEEPER=0 _N_=14 KEEPER=1 _N_=15 KEEPER=0 _N_=15 KEEPER=1 _N_=16 KEEPER=0 _N_=16 KEEPER=1 _N_=17 KEEPER=0 _N_=17 KEEPER=1 _N_=18 KEEPER=0 _N_=18 KEEPER=1 _N_=19 KEEPER=0 _N_=19 KEEPER=1 _N_=20 KEEPER=0 _N_=20 KEEPER=1 _N_=21 KEEPER=0 _N_=21 KEEPER=0 _N_=22 KEEPER=0 _N_=22 KEEPER=1 _N_=23 KEEPER=0 _N_=23 KEEPER=1 _N_=24 KEEPER=0 _N_=24 KEEPER=1 _N_=25 KEEPER=0 _N_=25 KEEPER=1 _N_=26 KEEPER=0 _N_=26 KEEPER=1 _N_=27 KEEPER=0 _N_=27 KEEPER=1 _N_=28 KEEPER=1 _N_=28 KEEPER=1 _N_=29 KEEPER=0 _N_=29 KEEPER=1 _N_=30 KEEPER=0 _N_=30 KEEPER=1 _N_=31 KEEPER=0 _N_=31 KEEPER=1 _N_=32 KEEPER=0 _N_=32 KEEPER=1 _N_=33 KEEPER=0 _N_=33 KEEPER=1 _N_=34 KEEPER=0 _N_=34 KEEPER=1 _N_=35 KEEPER=0 _N_=35 KEEPER=1 _N_=36 KEEPER=0 _N_=36 KEEPER=1 _N_=37 KEEPER=0 _N_=37 KEEPER=1 _N_=38 KEEPER=0 _N_=38 KEEPER=1 _N_=39 KEEPER=0 _N_=39 KEEPER=1 _N_=40 KEEPER=0 _N_=40 KEEPER=1 _N_=41 KEEPER=0 _N_=41 KEEPER=1 _N_=42 KEEPER=0 _N_=42 KEEPER=1 _N_=43 KEEPER=0 _N_=43 KEEPER=1 _N_=44 KEEPER=0 _N_=44 KEEPER=1 _N_=45 KEEPER=0 _N_=45 KEEPER=1 _N_=46 KEEPER=0 _N_=46 KEEPER=1 _N_=47 KEEPER=0 _N_=47 KEEPER=1 _N_=48 KEEPER=0 _N_=48 KEEPER=1 _N_=49 KEEPER=0 _N_=49 KEEPER=1 _N_=50 KEEPER=0 _N_=50 NOTE: The data set WORK.SET1 has 49 observations and 2 variables. NOTE: The data set WORK.SET2 has 1 observations and 2 variables. NOTE: The DATA statement used 1.1 seconds. */