*! version 1.0.0 TJS 15aug1997 STB-41 dm53 program define dups version 5.0 local varlist "opt ex" local options "DROP Expand(str) Key(str) Unique Terse" parse "`*'" tempvar recnum first ldup ldup1 * convert switches to logicals local drop = "`drop'" == "drop" local unique = "`unique'" == "unique" local terse = "`terse'" == "terse" * if req, create expand variable (or error message) if `drop' { if "`expand'" == "" { local expand "_expand" } confirm new var `expand' } * if req, do wildcard substitution of varlist for varlist2 if "`key'" == "*" { local key "`varlist'" } * obtain existing sort order local sortby: sortedby qui gen long `recnum' = _n * reorder data and list grouping vars sort `varlist' di _n in gr "group by:" in ye " `varlist'" * obtain varnames for group and count Chkvname _group _grp group local group "$S_1" Chkvname _count _cnt count local count "$S_1" * do calculations qui gen `group' = . qui by `varlist': gen `count' = _N qui by `varlist': gen `first' = _n==1 qui count if `count' > 1 & `first' local ngrps = _result(1) qui count if `first' local uniq = _result(1) - `ngrps' di _n in gr "groups formed: " in ye `ngrps' * if req, display full info on duplicates if `ngrps' > 0 & ~`terse' { gen `ldup' = `count' > 1 & `first' gsort -`ldup' qui replace `group' = _n di _n _c in gr "groups of duplicate observations:" li `group' `count' `key' if `ldup', noobs } * if req, display full info on unique obs if `unique' & ~`terse' { if `uniq' > 0 { gen `ldup1' = `count' == 1 & `first' gsort -`ldup1' qui replace `group' = _n di _n _c in gr "unique observations:" li `group' `count' `key' if `ldup1', noobs } else { di _n in gr "no unique observations found" } } * if req, display terse output if `ngrps' > 0 & `terse' { di _n in gr "total observations:" in ye %5.0f _N di in gr " in duplicates " in ye %5.0f _N - `uniq' di in gr " in unique " in ye %5.0f `uniq' } * if req, drop duplicates if `drop' { nobreak { sort `varlist' di qui by `varlist': gen `expand' = _N keep if `first' di _n in gr "observations remaining: " in ye _N } } * restore prior sort order sort `sortby' `recnum' drop `group' `count' end program define Chkvname *! version 1.0.0 NJC 14aug1997 *! version 1.0.1 TJS 15aug1997 /* args: `1' -- name to try first `2' -- name to try second `3' -- generic name */ version 5.0 capture confirm variable `1' if _rc != 0 { local varname "`1'" } else { di _n in bl "warning: `1' already defined" capture confirm variable `2' if _rc != 0 { local varname "`2'" } else { di in bl "warning: `2' already defined" local varname : tempvar tempvar varname di in bl " note: `3' variable is now" in wh " `varname'" } } global S_1 "`varname'" end