How to Create a Three-Way Table in R (With Examples)

To create a three-way table in R, you can use the threeWayTable() function from the expss package. This function requires three datasets as its arguments, each representing one of the three dimensions of the table. Once the datasets are supplied, R will automatically generate the table. This table can then be customized by adding labels, formatting, and other graphical elements. Examples of how to use this function are provided to help you get started.


A three-way table is a type of table that displays the frequencies for three categorical variables.

The easiest way to create a three-way table in R is to use the xtabs() function:

three_way <- xtabs(~ var1 + var2 + var3, data=df) 

If you’d like to view the three-way table in a more compact manner, you can use the ftable() function:

three_way_ftable <- ftable(three_way)

Note: Both the xtabs() and ftable() functions are built into base R.

The following example shows how to use these functions to create three-way tables in R in practice.

Example: How to Create Three-Way Tables in R

Suppose we have the following data frame that contains information about various basketball players:

#create data frame
df <- data.frame(team=c('A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'),
                 position=c('G', 'G', 'G', 'F', 'F', 'G', 'G', 'F', 'F', 'F'),
                 starter=c('Yes', 'No', 'No', 'Yes', 'No',
                           'Yes', 'No', 'Yes', 'Yes', 'No'),
                 points=c(30, 28, 24, 24, 28, 14, 16, 20, 34, 29))

#view data frame
df

   team position starter points
1     A        G     Yes     30
2     A        G      No     28
3     A        G      No     24
4     A        F     Yes     24
5     A        F      No     28
6     B        G     Yes     14
7     B        G      No     16
8     B        F     Yes     20
9     B        F     Yes     34
10    B        F      No     29

Suppose we would like to create a three-way table to view the frequency of players based on three variables: team, position, and starter.

We can use the function to create this three-way table:

#create three-way table
three_way <- xtabs(~ team + position + starter, data=df)

#view three-way table
three_way

, , starter = No

    position
team F G
   A 1 2
   B 1 1

, , starter = Yes

    position
team F G
   A 1 1
   B 2 1

The first table in the output shows the frequency of players by team and position where the starter variable is equal to No.

The second table shows the frequency of players by team and position where the starter variable is equal to Yes.

If we’d like, we can use the ftable() function to “flatten” these tables into one table:

#convert table to ftable
three_way_ftable <- ftable(three_way)

#view ftable
three_way_ftable

              starter No Yes
team position               
A    F                 1   1
     G                 2   1
B    F                 1   2
     G                 1   1

For example, we can see:

  • There was 1 player who was on team A, position F, and was not a starter.
  • There was 1 player who was on team A, position F, and was a starter.
  • There were 2 players who were on team A, position G, and were not starters.

And so on.

The following tutorials explain how to perform other common tasks in R:

x