program def fbar, sort *! NJC 1.1.1 20 June 2001 * NJC 1.1.0 19 June 2001 * NJC 1.0.0 15 June 2001 version 7.0 syntax varname [if] [in] [aweight fweight iweight/] /* */ [ , L2title(str) B2title(str) T2title(str) PERCent Totalpc /* */ BY(varname) YLAbel YLAbel(str) Gap(int 4) Fsort RFsort * ] if "`fsort'" != "" & "`rfsort'" != "" { di in r "must choose between fsort and rfsort options" exit 198 } * set up `touse' and test any by() marksample touse, strok if "`by'" != "" { markout `touse' `by', strok qui tab `by' if `touse' if `r(r)' > 6 { di in r "too many categories in by() variable" exit 198 } } * initialise `q', quantity to be summed tempvar q gen `q' = `touse' if "`exp'" != "" { qui replace `q' = `q' * `exp' } * percents? if "`totalpc'" != "" { local percent "percent" } qui if "`percent'" != "" { if "`by'" == "" | "`totalpc'" != "" { su `q', meanonly replace `q' = `q' * (100 / r(sum)) local pctext "percent of total" } else { tempvar bysum sort `varlist' by `varlist' : gen `bysum' = sum(`q') by `varlist' : replace `bysum' = `bysum'[_N] replace `q' = `q' * (100 / `bysum') if `q' local pctext "percent of category" } } * set up what is to be shown if "`by'" == "" { local show "`q'" } else { qui separate `q' if `touse', by(`by') local show "`r(varlist)'" foreach X of varlist `show' { local label : variable label `X' local pequal = index(`"`label'"',"=") local label = substr(`"`label'"',`pequal' + 2, .) label variable `X' `"`label'"' } } * b2title default if `"`b2title'"' == "" { local label : variable label `varlist' if length("`label'") == 0 | length("`label'") > 50 { local label "`varlist'" } local b2title `"`label'"' } * l2title default if `"`l2title'"' == "" { local l2title = cond("`percent'" != "", "`pctext'", "frequency") if "`by'" != "" { local label : variable label `by' if length("`label'") == 0 | length("`label'") > 32 { local label "`by'" } local l2title `"`l2title', subdivided by `label'"' } } * t2title default blank with one variable if `"`t2title'"' == "" & "`by'" == "" { local t2title " " } * ylabel if "`ylabel'" == "" { local ylabel "ylabel" } else if "`ylabel'" != "ylabel" { local ylabel "yla(`ylabel')" } * sort order sort `varlist' qui if "`fsort'`rfsort'" == "" /* */ | ("`by'" != "" & "`percent'" != "" & "`totalpc'" == "") { local sortvar "`varlist'" } else qui { tempvar freq which id tempname wlabel capture confirm string variable `varlist' local isstr = cond(_rc == 0, "*", "") * category frequencies by `varlist' : gen `freq' = sum(`q') if "`fsort'" != "" { by `varlist' : replace `freq' = `freq'[_N] } else by `varlist': replace `freq' = -`freq'[_N] * mapping labels and sorting sort `touse' `freq' `varlist' by `touse' `freq' `varlist' : gen `which' = (_n == 1) * `touse' replace `which' = sum(`which') gen long `id' = _n su `which', meanonly forval i = 1 / `r(max)' { su `id' if `which' == `i', meanonly local label = `varlist'[`r(min)'] `isstr' local label : label (`varlist') `label' label def `wlabel' `i' `"`label'"', modify } label val `which' `wlabel' sort `which' local sortvar "`which'" } graph `show' if `q', bar `options' `ylabel' gap(`gap') /* */ by(`sortvar') l2("`l2title'") b2("`b2title'") t2("`t2title'") end