*# dat # {cmd:not duplicate} - Simple, yet hard to describe - shows the ways in which records are not duplicate # help *! 7oct2009 program nodup version 8.2 syntax [varlist] [if],dup(varlist) [over(integer 2)] local varlist :list varlist-dup preserve capture keep `if' tempvar tag subg subsum submiss qui duplicates tag `dup',g(`tag') qui keep if `tag' qui count if `r(N)'==0 { di "{txt:No duplicates}" exit } drop `tag' egen `tag'=tag(`dup'), missing qui count if `tag' local sets= r(N) qui count if `tag' & mi(`=subinstr("`=trim("`dup'")'"," ",",",.)') local setsmiss= r(N) mata: out=J(0,4,"") foreach v of varlist `varlist' { egen `subg'=tag(`v' `dup'), missing bysort `dup': egen `subsum'=sum(`subg') qui count if `subsum'>1 & `tag' if `r(N)' { mata: out=out\"`v'","`r(N)'","","" bysort `dup': egen `submiss'=sum(`subg'&mi(`v')) qui count if `subsum'>1 & `tag' & `submiss'==0 mata: out[rows(out),3]="`r(N)'" qui count if `subsum'>`over' & `tag' mata: out[rows(out),4]="`r(N)'" drop `submiss' } drop `subg' `subsum' } di di "{txt:Duplicates by `dup':} {res:`sets' sets, `setsmiss' w/missing}" _n mata: table=table_createM(("Sets differing by","N","N w/o .",">`over' vals")\out) mata: asarray(table,"head",1) mata: table_code(table,"vline","t",1,"thick") mata: table_present(table) end