*! mdesc Version 2.1 dan_blanchette@unc.edu 25Aug2011 
*!      Rose Anne Medeiros            |           Dan Blanchette
*! Department of Sociology, Rice Univ | the carolina population center, unc-ch
*- made it so that output looks nicer when number of obs with missing values is 
*   greater then 99,999 and made some updates to the help file.
*  and made some changes that Nick Cox suggested.
* mdesc Version 2.0 dan_blanchette@unc.edu 10Jun2011 
* mdesc Version 1.0 Rose Anne Medeiros 18Jul2008
* Returns a table with number missing, total, and missing/total

program mdesc, rclass byable(recall)
version 10
    syntax [varlist] [if] [in] [, ABbreviate(integer 12) ANY ALL NOne ]

if !missing("`any'") + !missing("`all'") + !missing("`none'") > 1 {
  display as error "specify only the {opt any} option or the {opt all} option or the {opt none}"
  exit 198
}

local nvars : word count `varlist' 
if [!missing("`any'") | !missing("`all'")] & `nvars' == 1  {
  if !missing("`any'") {
    display as green "since only 1 variable was specified, the {opt any} option will be ignored"
    local any
  }
  else if !missing("`all'") {
    display as green "since only 1 variable was specified, the {opt all} option will be ignored"
    local all
  }
}

if `abbreviate' > 32 {
  local abbreviate= 32
}

local c1= 17
local c2= 16
local c3= 47
if `abbreviate' > 16 {
  local c1= `abbreviate' + 2
  local c2= `abbreviate' + 1
  local c3= `abbreviate' + 30
}

if !missing("`none'") {
  display as text _n "            " _column(`c1')"{c |}      None                        Percent              "
  display as text    "    Variable" _column(`c1')"{c |}     Missing          Total     Not Missing"
}
else {
  display as text _n "    Variable" _column(`c1')"{c |}     Missing          Total     Percent Missing"
}
display as text "{hline `c2'}{c +}{hline `c3'}"

// this generates a local macro called touse
marksample touse, novarlist
quietly: count  if `touse' == 1
tempvar total
scalar `total'= r(N)

if missing("`any'") & missing("`all'") & missing("`none'") {
  foreach var of local varlist {
     quietly {
         // tempvar mytemp
         // gen `mytemp'= missing(`var')
         count  if missing(`var') & `touse' == 1
         return scalar miss= r(N)
         // count  if `touse' == 1
         // return scalar total= r(N)
  	 return scalar total= scalar(`total')
         return scalar percent= (return(miss)/return(total) * 100)
         // drop `mytemp'
     }
         display as text %`=`c1'-2's abbrev("`var'",`abbreviate') _column(`c1')"{c |} " ///
           as result %11.0gc `return(miss)' "    "     ///
           %11.0gc `return(total)' "       " ///
           %8.2f `return(percent)'
         if return(miss) > 0 { 
           local miss_vars `miss_vars' `var'
         }
         return local miss_vars `miss_vars'
         if return(miss) == 0 { 
           local notmiss_vars `notmiss_vars' `var'
         }
         return local notmiss_vars `notmiss_vars'
  }
  display as text "{hline `c2'}{c +}{hline `c3'}"
}
else if !missing("`any'") {
  quietly {
    tempvar mytemp
    local n= 1
    foreach var of varlist `varlist' {
      if `n' == 1 {
        gen byte `mytemp'= 1  if missing(`var')
      }
      else {
        replace `mytemp'= 1  if missing(`var')
      }
      local n= `n' + 1
    }
    count  if `mytemp' == 1 & `touse' == 1
    return scalar miss= r(N)
    return scalar total= scalar(`total')
    return scalar percent= (return(miss)/return(total) * 100)
  }
  display as text %`=`c1'-2's abbrev("any vars",`abbreviate') _column(`c1')"{c |}    " ///
    as result %8.0gc `return(miss)' "    "     ///
    %8.0gc `return(total)' "       " ///
    %8.2f `return(percent)'
  display as text "{hline `c2'}{c +}{hline `c3'}"
}
else if !missing("`all'") {
  quietly {
    tempvar mytemp
    local n= 1
    foreach var of varlist `varlist' {
      if `n' == 1 {
        gen byte `mytemp'= 1  if missing(`var')
      }
      else {
        replace `mytemp'= .  if !missing(`var')
      }
      local n= `n' + 1
    }
    count  if `mytemp' == 1 & `touse' == 1
    return scalar miss= r(N)
    return scalar total= scalar(`total')
    return scalar percent= (return(miss)/return(total) * 100)
  }
  display as text %`=`c1'-2's abbrev("all vars",`abbreviate') _column(`c1')"{c |}    " ///
    as result %8.0gc `return(miss)' "    "     ///
    %8.0gc `return(total)' "       " ///
    %8.2f `return(percent)'
  display as text "{hline `c2'}{c +}{hline `c3'}"
}
else if !missing("`none'") {
  quietly {
    tempvar mytemp
    local n= 1
    foreach var of varlist `varlist' {
      if `n' == 1 {
        gen byte `mytemp'= 1  if !missing(`var')
      }
      else {
        replace `mytemp'= .  if missing(`var')
      }
      local n= `n' + 1
    }
    count  if `mytemp' == 1 & `touse' == 1
    return scalar miss= r(N)
    return scalar total= scalar(`total')
    return scalar percent= (return(miss)/return(total) * 100)
  }
  display as text %`=`c1'-2's abbrev("no vars",`abbreviate') _column(`c1')"{c |}    " ///
    as result %8.0gc `return(miss)' "    "     ///
    %8.0gc `return(total)' "       " ///
    %8.2f `return(percent)'
  display as text "{hline `c2'}{c +}{hline `c3'}"
}


end