program _grepeat *! 1.0.0 NJC 21 July 2003 version 8.0 gettoken type 0 : 0 gettoken g 0 : 0 gettoken eqs 0 : 0 gettoken lparen 0 : 0, parse("(") gettoken rparen 0 : 0, parse(")") syntax [if] [in] , Values(str asis) [ by(varlist) Block(int 1) ] if `block' < 1 { di as err "block should be at least 1" exit 498 } marksample touse tempvar order obs which qui { gen long `order' = _n bysort `touse' `by' (`order') : /// gen long `obs' = _n if `touse' capture numlist "`values'" local isstr = _rc // ignore user type if `isstr' { gen `g' = "" local nvals : word count `values' tokenize `"`values'"' } else { gen double `g' = . local nvals : word count `r(numlist)' tokenize "`r(numlist)'" } gen long `which' = 1 + int(mod((`obs' - 1) / `block', `nvals')) if `isstr' { forval i = 1 / `nvals' { replace `g' = "``i''" if `which' == `i' } } else { forval i = 1 / `nvals' { replace `g' = ``i'' if `which' == `i' } compress `g' } } end