*---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)
;