Dear Statalisters,
could you please help with a conundrum I have not been able to resolve myself.
The code below creates a properly formatted docx table of summary stats of the auto data.
My problem is that when I try to force the formatting of certain variables to %12.0fc it works for some rows but not others. It seems to be related to the numbers taking up relatively more spaces but I thought that 12 should be enough. I experimented with other total numbers of spaces: 9,10 but it does not help.
I have put !!! in the comments before the lines of code not working as expected.
What works is to not add a nformat option in the initial *add table to file line
and format the other lines separately:
This solution seems not very elegant to me and I still do not see why the original approach does not work. Any suggestion to make this code more compact and efficient are also very welcome.
Thank you!
could you please help with a conundrum I have not been able to resolve myself.
The code below creates a properly formatted docx table of summary stats of the auto data.
My problem is that when I try to force the formatting of certain variables to %12.0fc it works for some rows but not others. It seems to be related to the numbers taking up relatively more spaces but I thought that 12 should be enough. I experimented with other total numbers of spaces: 9,10 but it does not help.
I have put !!! in the comments before the lines of code not working as expected.
Code:
version 16
set more off
sysuse auto, clear
* create a new var called model to add a nested structure to the data
gen model = substr(make,1,strpos(make," ")-1)
* Subaru is the only one with a single word
replace model = make if make == "Subaru"
* remove full stops
replace model = subinstr(model,".","",.)
la var model "Model"
* collect all num vars in a macro
ds, has(type numeric)
local vars r(varlist)
* save number of obs in a macro to report in a single line at the bottom of the summary stats table
qui count
local obs = r(N)
* save number of models in a macro as well
qui levelsof model, l(models) clean
local count_models: word count `models'
* start docx file
putdocx begin
qui tabstat `vars', stats(mean sd min p50 max) save
mat out = r(StatTotal)'
local rows = rowsof(out)
local cols = colsof(out)
* fill an auxilliary matrix with the two counts to add at the bottom
matrix add = J(2,5,.)
matrix add[1,1] = `count_models'
matrix add[2,1] = `obs'
mat out = out \ add
*matlist out
* add table to file
putdocx table tbl = matrix(out), rownames colnames nformat(%12.3fc)
putdocx table tbl(.,.), font("Times New Roman") border(all, nil) halign(center)
* name columns
putdocx table tbl(1,1) = ("Variable names"), font("Times New Roman") halign(center)
putdocx table tbl(1,2) = ("Mean"), font("Times New Roman") halign(center)
putdocx table tbl(1,3) = ("Std. Dev."), font("Times New Roman") halign(center)
putdocx table tbl(1,5) = ("Median"), font("Times New Roman") halign(center)
* name rows with var labels
local c = 2
foreach v of local vars {
local lab: var lab `v'
putdocx table tbl(`c',1)= ("`lab'"), font("Times New Roman")
local ++c
}
* adjust formatting of certain variables and columns as needed
* !!! price is not working
putdocx table tbl(2,.), nformat(%12.0fc)
* !!! this one works for all other vars except weight
forv i = 4/6 {
putdocx table tbl(.,`i'), nformat(%9.0fc)
}
* add the model and make labels
local c = `rows' + 2
putdocx table tbl(`c',1) = ("Models"), font("Times New Roman")
putdocx table tbl(`c',.), nformat(%6.0fc)
* replace the missing dots with blanks on that row
forv i = 3/6 {
putdocx table tbl(`c',`i') = ("")
}
* go to next row
local ++c
putdocx table tbl(`c',1)= ("Makes"), font("Times New Roman")
putdocx table tbl(`c',.), nformat(%6.0fc)
forv i = 3/6 {
putdocx table tbl(`c',`i') = ("")
}
* add borders
putdocx table tbl(1,.), border(top, thick) border(bottom, single) border(start, nil) border(end, nil)
local last = rowsof(out) + 1
putdocx table tbl(`last',.), border(bottom, thick) border(start, nil) border(end, nil)
* close and save
putdocx save sysauto_summ_stats, replace
Code:
putdocx table tbl = matrix(out), rownames colnames
Code:
* adjust format of remaining lines in cols 2 and 3
local last = `rows' + 1
forv c = 3/`last' {
putdocx table tbl(`c',2), nformat(%9.3fc)
putdocx table tbl(`c',3), nformat(%9.3fc)
}
Thank you!

Comment