📄 codebook.ado
字号:
return scalar Var = .
exit
}
tempname max mean min p Var
qui summ `v' if `touse'
scalar `min' = r(min)
scalar `max' = r(max)
scalar `mean' = r(mean)
scalar `Var' = r(Var)
// v constant
capture assert missing(`v') | (`Var' == 0) if `touse'
if _rc == 0 {
return scalar units = 1 // current behavior
return scalar min = `min'
return scalar max = `max'
return scalar mean = `mean'
return scalar Var = `Var'
exit
}
// determine unit
scalar `p' = 1
capture assert float(`v') == float(round(`v',1)) if `touse'
if _rc == 0 {
while _rc == 0 {
scalar `p' = `p'*10
capture assert float(`v') == float(round(`v',`p')) if `touse'
}
scalar `p' = `p'/10
}
else {
while _rc {
scalar `p' = `p'/10
capture assert float(`v') == float(round(`v',`p')) if `touse'
}
}
return scalar units = `p'
return scalar min = round(`min',`p')
return scalar max = round(`max',`p')
return scalar mean = `mean'
return scalar Var = `Var'
end
program Piece
args color col len str
local piece : piece 1 `len' of `"`macval(str)'"'
dis as `color' `"`macval(piece)'"'
local i 2
local piece : piece 2 `len' of `"`macval(str)'"'
while `"`macval(piece)'"' != "" {
dis as `color' _col(`col') `"`macval(piece)'"'
local ++i
local piece : piece `i' `len' of `"`macval(str)'"'
}
end
program Header
syntax [, LANGuages(str) Notes]
dis _n as txt _col(16) "Dataset: " _c
if `"$S_FN"' == "" {
dis as txt "[unnamed]"
}
else {
_shortenpath `"$S_FN"' , len(`=c(linesize)-28')
dis as res `"`r(pfilename)'"'
}
dis as txt _col(13) "Last saved: " _c
if `"$S_FN"' == "" {
dis as txt "never"
}
else if `"$S_FNDATE"' == "" {
dis as txt "unknown"
}
else {
dis as res `"$S_FNDATE"'
}
if `"$S_FN"' != "" {
qui des, short
if r(changed) {
dis as txt _col(26) "DATA HAVE CHANGED SINCE LAST SAVED"
}
}
dis
quiet label language
local cln `r(language)'
local lns `r(languages)'
local nln : list sizeof languages
if "`lns'" != "default" {
dis "{p 3 26 2}{txt:Available languages:}{space 2}{res:`lns'}{p_end}"
if `nln' > 0 {
dis "{p 4 26 2}{txt:Codebook languages:}{space 2}{res:`languages'}{p_end}"
}
else if `nln' == 0 {
dis "{col 6}{txt:Codebook language:} {res:`cln'}"
}
dis
}
if "`languages'" == "" {
local x : data label
if `"`x'"' == "" {
local x "[none]"
}
dis as txt _col(18) "Label:" as res `" `x'"'
}
else {
foreach ln of local languages {
if "`ln'" == "`cln'" {
local x : data label
}
else {
local x : char _dta[_lang_v_`ln']
}
if `"`x'"' == "" {
local x "[none]"
}
dis as txt "{ralign 22:Label in `ln'}:" as res `" `x'"'
}
dis
}
capture memory
if _rc {
if _rc == 1 {
exit 1
}
local ptrsize 4
}
else {
local ptrsize = r(size_ptr)
}
quietly desc, short
dis _col(4) as txt "Number of variables: " ///
as res trim(string(r(k),"%16.0gc"))
dis _col(1) as txt "Number of observations: " ///
as res trim(string(r(N),"%16.0gc"))
dis _col(19) as txt "Size: " ///
as res trim(string((r(width)+`ptrsize')*r(N),"%16.0gc")) ///
as txt " bytes ignoring labels, etc."
if "`notes'" != "" {
notes _dta
}
end
/* VarHeader v
displays the header for the report on variable v
*/
program VarHeader
syntax varname [, LANGuages(str)]
local v `varlist'
local vname `v'
if "`languages'" != "" {
dis _n "{txt}{hline}"
foreach ln of local languages {
if "`ln'" == "`:char _dta[_lang_c]'" {
local lbl : variable label `v'
}
else {
local lbl : char `v'[_lang_v_`ln']
}
if `"`lbl'"' == "" {
local lbl "(unlabeled)"
}
local len = length("`vname'`ln'")
if `len' < 22 {
local sp `"{space `=19-`len''}"'
dis `"{p 0 25}{res}`vname'`sp'{txt:in `ln':}{space 2}{res:`lbl'}{p_end}"'
}
else {
local sp `"{space `=22-length("in `ln'")'}"'
dis "{res:`vname'}" _n ///
`"{p 0 25}`sp'{txt:in `ln':}{space 2}{res:`lbl'}{p_end}"'
}
local vname
}
dis "{txt}{hline}" _n
}
else {
local lbl : variable label `v'
if `"`lbl'"' == "" {
local lbl "(unlabeled)"
}
dis _n "{txt}{hline}"
if length("`vname'") + length(`"`lbl'"') < `c(linesize)'-2 {
dis `"{res}`vname'{right:`lbl'}"'
}
else {
local sp = "{space `=39-length("`v'")'}"
dis `"{p 0 39}{res}`vname'`sp'`lbl'{p_end}"'
}
dis "{txt}{hline}" _n
}
end
/* ReportProblems
creates a report on potential problems in the data
*/
program ReportProblems
if `"$S_FN"' == "" {
local dataset "[unnamed]"
}
else {
_shortenpath `"$S_FN"' , len(`=c(linesize)-36')
local dataset `"`r(pfilename)'"'
qui des, short
if r(changed) {
global T_cb_datachanged 1
}
}
// len := max of varlists to be displayed
local len 0
foreach source in cons labelnotfound notlabeled str_type ///
str_leading str_trailing str_embedded realdate {
local len = max(`len',`: length global T_cb_`source'')
}
if `len' == 0 {
dis _n ///
`"{txt}no potential problems in dataset {res}`dataset'"'
exit
}
dis _n `"{txt} Potential problems in dataset {res}`dataset'"' _n
// if "$T_cb_datachanged" != "" {
// dis as txt " data changed since last saved" _n
// }
local hlen = clip(35+`len', 50, c(linesize))
dis as txt _col(16) "potential problem variables"
dis as txt "{hline `hlen'}"
Msg cons "constant (or all missing) vars"
Msg labelnotfound "vars with nonexisting label"
Msg notlabeled "incompletely labeled vars"
Msg str_type "strvars that may be compressed"
Msg str_leading "string vars with leading blanks"
Msg str_trailing "string vars with trailing blanks"
Msg str_embedded "string vars with embedded blanks"
Msg realdate "noninteger valued date vars"
dis as txt "{hline `hlen'}"
end
/* Msg mac txt
display utility for Problems
*/
program Msg
args mac txt
if `"${T_cb_`mac'}"' == "" {
exit
}
local len = 32 - length(`"`txt'"')
dis as txt `"{p 0 35}{space `len'}`txt'{space 3}"' ///
as res "${T_cb_`mac'}" "{p_end}"
end
program ReturnGlobals, rclass
local macros datachanged cons labelnotfound ///
notlabeled str_type str_leading ///
str_trailing str_embedded realdate
foreach r of local macros {
return local `r' `"${T_cb_`r'}"'
}
end
program ParseLanguage, sclass
args languages languages2
if "`languages'" != "" & `"`languages2'"' != "" {
dis as err "options languages and languages() may not be combined"
exit 198
}
quiet label language
local cln `r(language)'
local dlns `r(languages)'
if ("`languages'" != "") | (`"`languages2'"' == "_all") {
local lns `dlns'
}
else if `"`languages2'"' != "" {
local notfound : list languages2 - dlns
if "`notfound'" != "" {
dis as err "languages() invalid; `notfound' not defined"
exit 100
}
local lns : list uniq languages2
}
// if "`lns'" == "default" {
// local lns
// }
sreturn clear
sreturn local lns `lns'
end
program define DoTab1, rclass
args v touse lbl
preserve
qui sum `v'
if r(N) > 0 {
contract `v' if `touse' & !missing(`v')
local n = _N
local uncoded = 0
forvalues i = 1/`n' {
local c = `v'[`i']
local s : label `lbl' `c'
if ("`s'" == "`c'") local ++uncoded
}
if `uncoded' > 0 {
dis as txt ", but {res:`uncoded'} nonmissing value" ///
cond(`uncoded'==1," is", "s are") " not labeled"
global T_cb_notlabeled $T_cb_notlabeled `v'
}
else {
dis
}
return local exist = 1
}
else {
return local exist = 0
}
restore
end
program define DoTab2, rclass
args v touse nlbl cwidth notshown
preserve
contract `v' if `touse'
qui sum `v'
local n = _N
forvalues i = 1 / `n' {
local c = `v'[`i']
if `nlbl' == 1 {
dis _col(24) as res %7.0g _freq[`i'] ///
_col(33) as res %8.0g `c' ///
_col(43) as txt _c
local s : label `1' `c'
if `"`macval(s)'"' != "`c'" {
Piece txt 43 32 `"`macval(s)'"'
}
else display
}
else {
dis _col(24) as res %7.0g _freq[`i'] ///
_col(31) as res %8.0g `c' ///
_col(42) as txt _c
forvalues j = 1 / `nlbl' {
local s : label ``j'' `c' `cwidth'
if (`"`macval(s)'"' == "`c'") local s ""
dis as res `"{lalign `cwidth':`macval(s)'}"' _c
if (`j'<`nlbl') dis _skip(3) _c
}
dis
}
}
if "`notshown'" != "" {
dis as txt _n "(value labels `notshown' are not listed)"
}
restore
end
exit
GLOBALS USED FOR VARLISTS WITH POTENTIAL PROBLEMS
T_cb_datachanged flags data have changed since last saved
T_cb_cons vars that are constant or missing
T_cb_labelnotfound vlabeled vars with nonexisting label
T_cb_notlabeled vlabeled vars with unlabeled values
T_cb_str_type strvars which may be compressed
T_cb_str_leading strvars with leading blanks
T_cb_str_trailing strvars with trailing blanks
T_cb_str_embedded strvars with embedded blanks
T_cb_realdate noninteger valued date variables
DISPLAY FORMATS
longlong ------------------------------------------ average january temperature
type: numeric (int)
label: gould, but 2 values are not labeled
range: [xxx,xxx]
units: 1
unique values: 5
coded missing: 72
Tabluation: Freq. Numeric label
xxxxxxx xxxxxxxx (none)
1234567 12345678
Or:
Tabluation: Freq. value
xxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1 2 3
12345678901234567890123456789012345678901234
Warning: variable has leading, trailing, embedded blanks
HISTORY
1.3.13 bug fix default language
1.3.12 now display multiple value labels
1.3.11 multiple languages
1.3.10 added support for if/in
1.3.4 made codebook sort-stable
1.3.2 added -problems-
1.3.1 ported to version 8
added support for extended missing values
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -