*! Make a categorical variable by cutting at break points STB-50 dm66.1 *! Addition to egen in stata 6.0 *! Version 1.0, David Clayton and Michael Hills March 1999 program def _gcut version 6.0 local type "`1'" mac shift local g "`1'" mac shift mac shift local varlist "req ex min(1) max(1)" local if "opt" local in "opt" local options "AT(string) Group(real 0) ICodes Label" parse "`*'" parse "`varlist'", parse(" ") tempvar pctile x touse mark `touse' `if' `in' markout `touse' `varlist' qui gen `x' = `1' if `touse' if "`at'"=="" & `group'==0 { di in red "needs at or group option" exit } if "`at'"=="" & `group'!=0 & "`icodes'"==""{ local icodes = "icodes" } if "`label'"!="" & "`icodes'"=="" { local icodes = "icodes" } cap label drop `g' if "`at'"=="" { local count = 1 qui summ `x' local extra = string(_result(5)) local at "`extra'" qui pctile `pctile' = `x', nq(`group') while `count' < `group' { local extra = string(`pctile'[`count']) local at "`at',`extra'" local count = `count' + 1 } qui summ `x' local extra = string(_result(6)+1) local at "`at',`extra'" } qui gen `g'=. numlist "`at'" , asc tokenize "`r(numlist)'" local n: word count `r(numlist)' local i=0 while "`1'"!="" { local cutp `1' if "`icodes'"=="" { qui replace `g' = `cutp' if `x' >= `cutp' & `touse' } else { qui replace `g' = `i' if `x'>=`cutp' & `touse' } if `i'>0 & "`label'"!="" & "`icodes'" != "" { local code = `i' - 1 la def `g' `code' "`lastcut'-", a } if `i'>0 & "`label'"!="" & "`icodes'" == "" { la def `g' `lastcut' "`lastcut'-", a } local lastcut "`cutp'" local i=`i'+1 mac shift } if "`label'"!="" { la val `g' `g' } end