Bookmark and Share

Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: st: Formatted 3-way tables

From   Eric Booth <>
Subject   Re: st: Formatted 3-way tables
Date   Tue, 27 Mar 2012 10:07:50 -0500


On Mar 27, 2012, at 2:52 AM, Richard Moverare wrote:

> Eric, David,
> thank you for your replies! Both -tab3way- and -tablecol- seem to be
> doing what I want to do. But it seems a bit difficult to use -logout-
> in order to get a result that doesn't need further editing.

I don't have a lot of experience using -logout-, but perhaps if you provide specific details/examples of the difficulties you are having someone here could help.

> Thanks also for the information about using loops in -tabout-, I don't
> understand how I didn't see that. However, as I understand it, it is
> not a solution if you want supercolumns, only when you add more row,
> or do I miss something here?

I do use a similar method to add 'super columns' only in the sense that I create a combined cross- or column variable (with -egen-, as mentioned in my previous message), label that variable with the combined categories, and then use that combined variable as the 'by' variable in -tabout- as the cross-var.    This method doesn't stack the column labels like[1]:

      Supercol1 label		  			  Supercol2 label
sublabel 1	sublabel2  			sublabel3	sublabel4

 instead,  this method produces tables with the  combined columns variable like this:

Supercol1-sublabel1	   	Supercol1-sublabel2     	Supercol2-sublabel3 	  Supercol2-sublabel4

which is the same information but with different column label formats.

Here is an example of what I'm talking about.  The first examples below are simple versions of two and three way tables with -tabout-.  The last example automates this process, as I described before, including adding the labels to the new combined cross-variable (called a "by" variable below).  Also, as I previously mentioned, if you've got tons of tables to produce, you can include all those variables in the loop (notice that I create a table for each combination of cross-variables for every other numeric variable in the -auto.dta- … you could use this to mass-produce your tables for many variables).   I often use a version of this code to produce many tables with combined cross-vars -- you'll have to adapt the code to your data[2].

*******************************	watch for wrapping issues below:	
*----make some fake data:
sysuse auto, clear
recode rep78 (.=0)
lab def r 0 "zero" 1 "one" 2 "two" 3 "three" 4 "four" 5 "five"
lab val rep78 r
fre rep78
	*--create more BY vars:
	clonevar rep782 = rep78
	clonevar foreign2 = foreign

*----1 twoway table
table trunk foreign, row col miss
tabout trunk foreign  using "twoway.xls", c(freq) replace

table trunk rep78, row col miss
tabout trunk rep78 using "twoway.xls", c(freq) append

**all the twoway tables in a loop:
cap rm "twoway_loop.xls"=
foreach x in rep78 foreign rep782 foreign2 {
	tabout trunk `x' using "twoway_loop.xls", c(freq) append
*-----2. combine the "by" vars to create N-way tables:

**simple example (no automation):
egen test = group(foreign rep78), missing
ta foreign rep78
ta test
lab def tlab 1 "domestic-zero" 2 "domestic-one" 3 "domestic-two" 4 "domestic-three" 5 "domestic-four" 6 "domestic-five" 7 "For-one" 8 "For-three" 9 "For-four" 10 "For-Five", modify
lab val test tlab
fre test
	table trunk test, row col miss
	tabout trunk test using "threeway_test.xls", replace c(freq)
drop test
lab drop tlab


**put all the combinations of supercols in this list:
cap rm "threeway_tabouts_allvars.xls"

/* NOTICE that you put the pairs of variables you want combined to create a cross- or column variable in the local macro 'vars' below  -- so you can repeat variables that you want paired with something else.  In 'vars',  rep78 & foreign are combined, then rep782 and foreign2...*/

loc vars rep78 foreign rep782 foreign2 foreign foreign2 rep78 foreign2
token `"`vars'"'
while `"`1'"' != ""  {
  di  `"ByVars: `1' and `2'"'
	*--combine cross-variables
		tempvar x
		egen `x' = group(`1' `2')
		lab var `x' `"`1' and `2'"'
		levelsof `1', loc(one)
		levelsof `2', loc(two)
			loc w1 `"`:val lab `1''"'
			loc w2 `"`:val lab `2''"'
				loc build ""
				loc i = 1
	*--build labels for supercol cross-vars
	foreach o in `one' {
		foreach t in `two' {
			*--account for missing pairs of By vars:
			qui su `1' if `1' == `o' & `2' == `t'
			if `r(N)' != 0 loc build `"`build' `i' `"`:lab `w1' `o''-`:lab `w2' `t''"'  "'
			 if `r(N)' != 0  loc i = `i'+1
				} //end.t
				} //end.o
				di in r `"`build'"'
			lab def `x'lab `build' ,modify
			lab val `x' `x'lab
	*--tabout for all other vars:
/* change the next line to "local myvars myvar1...varN" if you want to specify all the variables in your dataset that you want tables for */
	 ds make `vars' __* , not
	foreach vv in `r(varlist)' {
	qui tabout `vv' `x' using "threeway_tabouts_allvars.xls",  ///
	 	c(freq) append clab(Freq.)  h1(`"`vv' BY the combined `:var l `x'' var "')
		} //end.vv
mac shift 2
} //end.while


- Eric
Eric A. Booth
Public Policy Research Institute
Texas A&M University
Office: +979.845.6754

[1]  But I suppose you could use the LaTeX options of -tabout- to get the supercol labels stacked like this (like Table 14 in Watson's PDF guide to -tabout- I pointed you to earlier), but I haven't toyed with this since I've always found the method I describe to work fine for me.
[2]  I'm sure there are ways to clean-up the code above to make it more efficient, but I use this template since it's easier for me to find/debug errors in the loop if the tables aren't coming out just right.

*   For searches and help try:

© Copyright 1996–2017 StataCorp LLC   |   Terms of use   |   Privacy   |   Contact us   |   Site index