*! ifwins Version 1.0.2 dan_blanchette@unc.edu 23Feb2010 *! the carolina population center, unc-ch * - made it so that in ranges like: in -5/L work ** ifwins Version 1.0.1 dan.blanchette@duke.edu 10Nov2009 ** Center for Entrepreneurship and Innovation Duke University's Fuqua School of Business ** ifwins Version 1.0.0 dan.blanchette@duke.edu 25Feb2009 program ifwins version 9 local version : di "version " string(_caller()) ":" capture _on_colon_parse `0' if c(rc) | `"`s(after)'"' == "" { if !c(rc) { local 0 `"`s(before)'"' } if replay() { if "`e(prefix)'" != "ifwins" { error 301 // last estimates not found error message // error command exits } else { // just re-display e() estimates replay exit } } } Ifwins `0' end program Ifwins version 9 local cmdline `"ifwins `0'"' capture _on_colon_parse `0' // reset 0 before -syntax- so that options of the command submitted to -ifwins- don't create an invalid option message local 0 `"`s(before)'"' syntax [varlist] [if] [in] local command `"`s(after)'"' tokenize `"`command'"' local cmd `1' //remove `cmd' from `command' local I_esample : subinstr local command `"`cmd'"' " " // extract the if and in from `command' I_esample `I_esample' if `"`r(if)'"' != "" | `"`r(in)'"' != "" { di as err "options {cmd:if} and {cmd:in} are not allowed in the command submitted to {help ifwins:ifwins}" di as err "since {help ifwins:ifwins} subsets the data for the command submitted" exit 198 } capture unabcmd `cmd' if c(rc) == 0 { if inlist(`"`r(cmd)'"',"browse","edit","list") { I_lbe `I_esample' local options `r(options)' local varlist `r(varlist)' if `"`if'"' != "" { //take out the if in `if' local if : subinstr local if "if" " " } else if `"`if'"' == "" { local if _N > 0 } if `"`in'"' != "" { tempvar left_n right_n diff scalar `left_n' = `: word 2 of `: subinstr local in "/" " " '' scalar `right_n' = `: word 3 of `: subinstr local in "/" " " '' quietly count if `if' if r(N) < `right_n' { scalar `diff' = `right_n' - `left_n' scalar `left_n' = r(N) - `diff' if `left_n' <= 0 { scalar `left_n' = 1 } scalar `right_n' = r(N) } local sumif if `if' & inrange(sum((`if') != 0),`= `left_n'',`= `right_n'') } else if `"`in'"' == "" { local sumif if `if' } `cmd' `varlist' `sumif' , `options' exit } } // if command is not list, browse, or edit: preserve quietly { if `"`if'"' != "" { keep `if' if _N == 0 { noisily di as err "no observations for the {help if:if} condition" exit 198 } } if `"`in'"' != "" { tempvar new_n left_n right_n diff scalar `new_n' = _N scalar `left_n' = `: word 2 of `: subinstr local in "/" " " '' scalar `right_n' = `: word 3 of `: subinstr local in "/" " " '' if `new_n' < `right_n' { scalar `diff' = `right_n' - `left_n' if `diff' < 0 { scalar `diff' = 1 // make it so that it at least has one obs } scalar `left_n' = `new_n' - `diff' if `left_n' <= 0 { scalar `left_n' = 1 } local in = "in `= `left_n''/`= `new_n''" } keep `in' } } `command' restore end program I_esample, rclass version 9 syntax [anything (name=vcetype equalok)] [aweight fweight pweight iweight/] [if] [in] [, *] return local if `if' return local in `in' return local varlist `anything' return local options `options' end program I_lbe, rclass version 9 syntax [varlist] [if] [in] [, *] return local varlist `varlist' return local options `options' end