This vignette demonstrates how flattened contingency tables can becombined into more complex tables. For starters, we create a fewcontingendy tables.
tab.Class.Age<-xtabs(Freq~Class+Age,data=Titanic)tab.Survived.Class.Age<-xtabs(Freq~Survived+Class+Age,data=Titanic)tab.Survived.Class.Sex<-xtabs(Freq~Survived+Class+Sex,data=Titanic)tab.Survived.Class<-xtabs(Freq~Survived+Class,data=Titanic)tab.Survived.Sex<-xtabs(Freq~Survived+Sex,data=Titanic)tab.Survived.Age<-xtabs(Freq~Survived+Age,data=Titanic)tab.Survived<-xtabs(Freq~Survived,data=Titanic)Then we load thememisc package:
Next, we create a few flattened contingency tables:
Age Child AdultSurvived No 52 1438Yes 57 654 Sex Male FemaleSurvived No 1364 126Yes 367 344Since these tables have the same row variables, we can combine themcolumnwise:
Age Child Adult Sex Male Female Survived No 52 1438 1364 126 Yes 57 654 367 344We can even add a simple table of counts:
Age Child Adult Sex Male Female Total Survived No 52 1438 1364 126 1490 Yes 57 654 367 344 711Of course, it is not enough to see such tables on screen, we also mayneed them in a presentable format, such as LaTeX or HTML. For the latterformat we again haveformat_html andshow_html. To see how this works, we first look at theindividualftables:
| Age | |||||||
| Survived | Child | Adult | |||||
| No | 52 | 1438 | |||||
| Yes | 57 | 654 | |||||
| Sex | |||||||
| Survived | Male | Female | |||||
| No | 1364 | 126 | |||||
| Yes | 367 | 344 | |||||
… and then at their combination
| Age | Sex | |||||||||||||||
| Child | Adult | Male | Female | Total | ||||||||||||
| Survived | No | 52 | 1438 | 1364 | 126 | 1490 | ||||||||||
| Yes | 57 | 654 | 367 | 344 | 711 | |||||||||||
To make, in “knitr”, the creation of HTML-versions automatic one canuse the following little trick:
knit_print.ftable_matrix<-function(x,options,...) knitr::asis_output(format_html(x,digits=if(length(options$ftable.digits)) options$ftable.digitselse0, ...))Now we do not need to callshow_html while using“knitr”:
| Age | Sex | |||||||||||||||
| Child | Adult | Male | Female | Total | ||||||||||||
| Survived | No | 52 | 1438 | 1364 | 126 | 1490 | ||||||||||
| Yes | 57 | 654 | 367 | 344 | 711 | |||||||||||
This can be undone by removing the method function ofknit_print:
Forshow_html andtoLatex there are somevariants in how the variable names are positioned, for example:
| Age | Sex | ||||||||||||||
| Survived | Child | Adult | Male | Female | Total | ||||||||||
| No | 52 | 1438 | 1364 | 126 | 1490 | ||||||||||
| Yes | 57 | 654 | 367 | 344 | 711 | ||||||||||
| Age: | Child | Adult | Sex: | Male | Female | Total | ||||||||||||
| Survived | No | 52 | 1438 | 1364 | 126 | 1490 | ||||||||||||
| Yes | 57 | 654 | 367 | 344 | 711 | |||||||||||||
Of course it is also possible to combine flat contingency tablesrowwise:
ftab.Age.Survived<-ftable(tab.Survived.Age,col.vars=1)ftab.Sex.Survived<-ftable(tab.Survived.Sex,col.vars=1)ftab.Class.Survived<-ftable(tab.Survived.Class,col.vars=1)rbind( ftab.Age.Survived, ftab.Sex.Survived, ftab.Class.Survived,Total=tab.Survived) Survived No Yes Age Child 52 57 Adult 1438 654 Sex Male 1364 367 Female 126 344 Class 1st 122 203 2nd 167 118 3rd 528 178 Crew 673 212 Total 1490 711| Survived | |||||||
| No | Yes | ||||||
| Age | Child | 52 | 57 | ||||
| Adult | 1438 | 654 | |||||
| Sex | Male | 1364 | 367 | ||||
| Female | 126 | 344 | |||||
| Class | 1st | 122 | 203 | ||||
| 2nd | 167 | 118 | |||||
| 3rd | 528 | 178 | |||||
| Crew | 673 | 212 | |||||
| Total | 1490 | 711 | |||||
It is also possible to create theftables from tables ofpercentages or generic tables (created withgenTable)etc.
ptab.Survived.Age<-percentages(Survived~Age,data=Titanic)ptab.Survived.Sex<-percentages(Survived~Sex,data=Titanic)ptab.Survived.Class<-percentages(Survived~Class,data=Titanic)fptab.Age.Survived<-ftable(ptab.Survived.Age,col.vars=1)fptab.Sex.Survived<-ftable(ptab.Survived.Sex,col.vars=1)fptab.Class.Survived<-ftable(ptab.Survived.Class,col.vars=1)show_html(rbind( fptab.Age.Survived, fptab.Sex.Survived, fptab.Class.Survived ),digits=1)| Survived | |||||||
| No | Yes | ||||||
| Age | Child | 47 | . | 7 | 52 | . | 3 |
| Adult | 68 | . | 7 | 31 | . | 3 | |
| Sex | Male | 78 | . | 8 | 21 | . | 2 |
| Female | 26 | . | 8 | 73 | . | 2 | |
| Class | 1st | 37 | . | 5 | 62 | . | 5 |
| 2nd | 58 | . | 6 | 41 | . | 4 | |
| 3rd | 74 | . | 8 | 25 | . | 2 | |
| Crew | 76 | . | 0 | 24 | . | 0 | |
It is also possible to combinerbind andcbind:
tab.Age<-xtabs(Freq~Age,data=Titanic)tab.Sex<-xtabs(Freq~Sex,data=Titanic)tab.Class<-xtabs(Freq~Class,data=Titanic)show_html(rbind(cbind(fptab.Age.Survived,Total=tab.Age),cbind(fptab.Sex.Survived,Total=tab.Sex),cbind(fptab.Class.Survived,Total=tab.Class) ),digits=c(1,0)# One digit after dot for percentages# no digits for total counts.)| Survived | ||||||||||
| No | Yes | Total | ||||||||
| Age | Child | 47 | . | 7 | 52 | . | 3 | 109 | ||
| Adult | 68 | . | 7 | 31 | . | 3 | 2092 | |||
| Sex | Male | 78 | . | 8 | 21 | . | 2 | 1731 | ||
| Female | 26 | . | 8 | 73 | . | 2 | 470 | |||
| Class | 1st | 37 | . | 5 | 62 | . | 5 | 325 | ||
| 2nd | 58 | . | 6 | 41 | . | 4 | 285 | |||
| 3rd | 74 | . | 8 | 25 | . | 2 | 706 | |||
| Crew | 76 | . | 0 | 24 | . | 0 | 885 | |||
The same construct as LaTeX code:
toLatex(rbind(cbind(fptab.Age.Survived,Total=tab.Age),cbind(fptab.Sex.Survived,Total=tab.Sex),cbind(fptab.Class.Survived,Total=tab.Class) ),digits=c(1,0)# One digit after dot for percentages# no digits for total counts.)\begin{tabular}{llD{.}{.}{1}D{.}{.}{1}cD{.}{.}{0}}\toprule&&\multicolumn{2}{c}{Survived}&&\\\cmidrule{3-4}&&\multicolumn{1}{c}{No}&\multicolumn{1}{c}{Yes}&&\multicolumn{1}{c}{Total}\\\midruleAge & Child & 47.7 & 52.3 & & 109\\ & Adult & 68.7 & 31.3 & & 2092\\\midrule Sex & Male & 78.8 & 21.2 & & 1731\\ & Female & 26.8 & 73.2 & & 470\\\midrule Class & 1st & 37.5 & 62.5 & & 325\\ & 2nd & 58.6 & 41.4 & & 285\\ & 3rd & 74.8 & 25.2 & & 706\\ & Crew & 76.0 & 24.0 & & 885\\\bottomrule\end{tabular}