Combining flattened contingency tables (and other tables)

% \VignetteIndexEntry{Combining flattened contingency tables (and other tables)} % \VignetteEngine{knitr::rmarkdown} % \VignetteEncoding{UTF-8}

knitr::opts_chunk$set(comment=NA,
               fig.align="center",
               results="markup")

title: Combining flattened contingency tables (and other tables)

Combining flattened contingency tables (and other tables)

This vignette demonstrates how flattened contingency tables can be combined into more complex tables. For starters, we create a few contingendy 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 the memisc package:

library(memisc)

Next, we create a few flattened contingency tables:

(ftab.Survived.Age <- ftable(tab.Survived.Age))
(ftab.Survived.Sex <- ftable(tab.Survived.Sex))

Since these tables have the same row variables, we can combine them columnwise:

cbind(ftab.Survived.Age,
      ftab.Survived.Sex)

We can even add a simple table of counts:

cbind(ftab.Survived.Age,
      ftab.Survived.Sex,
      Total=tab.Survived)

Of course, it is not enough to see such tables on screen, we also may need them in a presentable format, such as LaTeX or HTML. For the latter format we again have format_html and show_html. To see how this works, we first look at the individual ftables:

show_html(ftab.Survived.Age)
show_html(ftab.Survived.Sex)

... and then at their combination

show_html(
  cbind(ftab.Survived.Age,
      ftab.Survived.Sex,
      Total=tab.Survived)
)

To make, in "knitr", the creation of HTML-versions automatic one can use 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.digits
                       else 0,
                ...))

Now we do not need to call show_html while using "knitr":

cbind(ftab.Survived.Age,
      ftab.Survived.Sex,
      Total=tab.Survived)

This can be undone by removing the method function of knit_print:

rm(knit_print.ftable_matrix)

For show_html and toLatex there are some variants in how the variable names are positioned, for example:

show_html(
  cbind(ftab.Survived.Age,
      ftab.Survived.Sex,
      Total=tab.Survived),
  varinfront=FALSE
)
show_html(
  cbind(ftab.Survived.Age,
      ftab.Survived.Sex,
      Total=tab.Survived),
  varontop=FALSE
)

Of course it is also possible to combine flat contingency tables rowwise:

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
)
show_html(
  rbind(
    ftab.Age.Survived,
    ftab.Sex.Survived,
    ftab.Class.Survived,
    Total=tab.Survived
  )
)

It is also possible to create the ftables from tables of percentages or generic tables (created with genTable) 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
)

It is also possible to combine rbind and cbind:

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.
)

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.
)


Try the memisc package in your browser

Any scripts or data that you put into this service are public.

memisc documentation built on May 29, 2024, 7:36 a.m.