A contingency table presents the joint density of one or more
categorical variables. Each entry in a contingency table is a count
of the number of times a particular set of factors levels occurs in
the dataset. For example, consider a list of plant species where
each species is assigned a relative seed size (small, medium, or
large) and a growth form (tree, shrub, or herb).
seed.sizes <- c("small", "medium", "large") growth.forms <- c("tree", "shrub", "herb") species.traits <- data.frame( seed.size = seed.sizes[c(1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3)], growth.form = growth.forms[c(3, 3, 2, 2, 1, 2, 2, 3, 1, 1, 1, 1)] )
A contingency table will tell us how many times each combination of
seeds.sizes and growth.forms occur.
tbl <- table(species.traits)
The output contingency table are of class
table. The behaviour of
these objects is not quite like a data frame. In fact, trying to
convert them to a data frame gives a non-intuitive result.
Coercion of the table into a data frame puts each factor of the
contingency table into its own column along with the frequency,
rather than keeping the same structure as original
If we wanted to turn the table into a data frame keeping the
original structure we use
as.data.frame.matrix. This function is
not well-documented in R, and this is probably the only situation in
which it would be used. But, it works.