*! 1.0.0 NJC 3 Nov 2000 (STB-59: dm86) program define swor version 6 local 0 `"=`0'"' syntax =/exp [if] [in] [, BY(varlist) Keep Generate(str) ] tempvar touse nobs random mark `touse' `if' `in' qui count if `touse' local N = `r(N)' if `N' == 0 { di in r "no observations to sample" exit 2000 } local exp = trim("`exp'") confirm integer number `exp' if `exp' < 0 { di in r "# in sample must be at least 1" exit 198 } else if `exp' > `N' { di in r "`exp' exceeds number of pertinent observations `N'" exit 198 } if "`keep'" != "" & "`generate'" == "" { di in r "generate( ) required with keep" exit 198 } if "`generate'" != "" { confirm new variable `generate' } else tempvar generat if "`by'" != "" { if "`in'" != "" { di in red "in may not be combined with by" exit 190 } local sby : sortedby sort `touse' `by' qui by `touse' `by' : gen long `nobs' = _N if `touse' su `nobs', meanonly if `exp' > `r(min)' { di in r "`exp' exceeds smallest group size `r(min)'" if "`sby'" != "" { sort `sby' } exit 198 } } if _caller() < 4.0 { gen float `random' = uniform0() } else gen float `random' = uniform() sort `touse' `by' `random' qui by `touse' `by' : gen byte `generat' = (_n <= `exp') * `touse' if "`keep'" == "" { drop if `generat' == 0 & `touse' } end