*---This macro:

    1. Ranks the observations in a SAS data set to specified groups,

    2. Generate a format statement,

    3. Output frequency of variable with formatted values. ;

 

%let fpath = c:\temp ;

 

libname test 'c:\client\orthterm\sasdata' ;

 

%let sds = temp;

%let var = dollar;

%let grp = 10 ;

   

%macro r_format( lib, fpath, sds, var, grp ) ;

 

  *---Rank the observations to groups ;

  proc rank data=&lib..&sds out=rank_&sds groups=&grp ;

    var &var ;

    ranks r_&var;

  run;

 

  proc sort data=rank_&sds ;

    by r_&var &var ;

  run;

 

  *---Output a data set to be used for fomating ranges;

  data r (keep=r_&var r1 r2);

    set rank_&sds ;

    retain r1;

    by r_&var &var ;

    if first.r_&var then r1 = &var ;

    if last.r_&var then

      do;

        r2 = &var ;

          output;

        end;

  run;

 

  *---Output format statement;

  data _null_ ;

    file "&fpath\format.txt" ;

    set r end = last ;

    if _n_ = 1 then

      do;

          *---If the length of variable is more than 6 then trunkate it to length 6 ;

        %do;

            %if %length( &var ) > 6 %then %let fmt = %substr(&var,1,6);

            %else %let fmt = &var ;

            %end;

        put @1 "proc format ;" /

            @3 "value &fmt._f" / ;

      end;

    if r_&var = . then put @3 r1 ' =  Missing ' ;

        else

        do;

          if r1 = r2 then put @3 r1  ' = "' r1 '"' ;

              else put @3 r1 ' - ' r2 ' = "' r1 ' to ' r2 '"' ;

          end;

    if last then put ";" / @1 "run;" ;

 

  run;

 

  *---Include format.txt;

  %include "&fpath\format.txt"  ;

 

  *---Frequency;

  proc freq data=&lib..&sds;

    title2 "Frequency of &var in data set &lib..&sds" ;

    tables &var / missing out=freq_&var._&grp.pct ;

    format &var &fmt._f. ;

  run;

 

%mend r_format ;

 

*---Example run;

data temp;

  do i=1 to 10000;

    dollar = int(ranuni(12324)*10000);

      output;

  end;

run;

 

*---Quartile;

%r_format( work, c:\temp, temp, dollar, 4) ;

*---Decile;

%r_format( work, c:\temp, temp, dollar, 10) ;

*---25 percentile;

%r_format( work, c:\temp, temp, dollar, 25) ;

*---100 percentile ;

%r_format( work, c:\temp, temp, dollar, 100) ;