Message Boards Message Boards

6 Replies
4 Total Likes
View groups...
Share this post:

Two-way contingency table

Posted 11 years ago
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?

POSTED BY: Steeve Brechmann
6 Replies

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

enter image description here

POSTED BY: Anton Antonov

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

POSTED BY: Anton Antonov
You should just go ahead and use R-Link.

Why Would a Mathematica User Care about R?
POSTED BY: Sam Carrettie
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.

POSTED BY: Carl Lemp
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.
POSTED BY: l van Veen
Well, I think that nobody have a clue ;).
POSTED BY: Steeve Brechmann
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
or Discard

Group Abstract Group Abstract