Message Boards Message Boards


Two-way contingency table

Posted 8 years ago
6 Replies
4 Total Likes
Hi folks,

Is there a way to compute, like in the R language, a two-way contingency table? I don't find any built-in command to do that, any clues?

6 Replies
Well, I think that nobody have a clue ;).
Posted 8 years ago
I think your question is very general? Perhaps you could give an example of what kind of table (2x2 or n*n) you want and what you would like to do with it?
I think you have to build your own function to do so.
I don't yet have enough of a clue to answer your questions but I think the lack of an answer might just be a matter of vocabulary.  Given the number of questions/answers related to Cross-tabs, pivot tables, and DataFrames on the mathematica Stack Exchange I think you are right that it is not built-in (yet, see functions planned for version 10) but it is easy to build for experienced users.

You should just go ahead and use R-Link.

Why Would a Mathematica User Care about R?

Fully explained how to do with several examples in this blog post "Contingency tables creation examples".

First get the package MathematicaForPredictionUtilities.m from MathematicaForPrediction at GitHub.


Generating data

Data generated in this Stack Overflow answer by Mr.Wizard.

key = # -> #2[[1]] &~MapIndexed~{"Region", "Gender", "Style", "Ship Date", "Units", "Price",  "Cost"};
choices = {{"North", "South", "East", "West"}, {"Boy", "Girl"}, {"Tee", "Golf", "Fancy"}, IntegerString[#, 10, 2] <> "/2011" & /@ Range@12, 
   Range@15, Range[8.00, 15.00, 0.01], Range[6.00, 14.00, 0.01]};
data = RandomChoice[#, 250] & /@ choices // Transpose;

Additional data assignments:

columnNames = {"Region", "Gender", "Style", "Ship Date", "Units", "Price", "Cost", "TotalCost", "DateObject"};
aColumnNames = AssociationThread[columnNames -> Range[Length[columnNames]]]

(* <|"Region" -> 1, "Gender" -> 2, "Style" -> 3, "Ship Date" -> 4, "Units" -> 5, "Price" -> 6, "Cost" -> 7, "TotalCost" -> 8, "DateObject" -> 9|> *)

data = Map[Append[#, #[[aColumnNames["Units"]]]*#[[aColumnNames[["Cost"]]]]] &, data];
data = Map[Append[#, DateObject@#[[aColumnNames["Ship Date"]]]] &, data];

This how the data looks like:

Pane[GridTableForm[data, TableHeadings -> columnNames],  ImageSize -> {600, 400}, Scrollbars -> True]

enter image description here

Using CrossTabulate

xtab = CrossTabulate[
   data[[All, aColumnNames /@ {"Gender", "Style", "TotalCost"}]]];
MatrixForm[#1, TableHeadings -> {#2, #3}] & @@ xtab

enter image description here

Using xtabsViaRLink

Install R first:


The function xtabsViaRLink calls R's xtabs :

rxtab = FromRXTabsForm@
      aColumnNames /@ {"Gender", "Style", "TotalCost"}]], {"Gender", 
     "Style", "TotalCost"}, "TotalCost ~ Gender + Style"];
MatrixForm[#1, TableHeadings -> {#2, #3}] & @@ rxtab

enter image description here

There is a function in Wolfram Function Repository for making contingency matrices: CrossTabulate.

enter image description here

Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
or Discard

Group Abstract Group Abstract