R contingency table on multiple crossed/interacted columns

252 Views Asked by At

I was wondering if there was a way to realize 'beautiful' contingency table on R on multiple columns. I am not sure the terms I used are precise enough, so There is what I am looking for:

I start with an example of my data:

structure(list(Gender = c("Male", "Female", "Male", "Male", "Male", 
"Male", "Male", "Male", "Male", "Male", "Male", "Female", "Male", 
"Male", "Male", "Male", "Male", "Female", "Male", "Male", "Female", 
"Male", "Male", "Male", "Male", "Male", "Female", "Female", "Male", 
"Female"), Race = c("White", "Hispanic/Latino(a)", "White", "White", 
"White", "White", "Black/African American", "Black/African American", 
"White", "Hispanic/Latino(a)", "Hispanic/Latino(a)", "Black/African American", 
"Hispanic/Latino(a)", "Black/African American", "White", "Hispanic/Latino(a)", 
"Hispanic/Latino(a)", "White", "Hispanic/Latino(a)", "Hispanic/Latino(a)", 
"White", "Black/African American", "White", "Hispanic/Latino(a)", 
"White", "Hispanic/Latino(a)", "Hispanic/Latino(a)", "Hispanic/Latino(a)", 
"Hispanic/Latino(a)", "White"), Age = structure(c(1L, 2L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 3L, 1L, 1L, 2L, 1L, 
1L, 1L, 3L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 1L), levels = c("(10,30]", 
"(30,50]", "(50,100]"), class = "factor")), row.names = c(7022L, 
3223L, 447L, 6750L, 5255L, 9689L, 9263L, 3865L, 8891L, 6190L, 
7438L, 6313L, 496L, 130L, 4771L, 4172L, 5150L, 4290L, 3960L, 
3552L, 2609L, 4007L, 6725L, 520L, 8034L, 8672L, 7903L, 8693L, 
9380L, 1257L), class = "data.frame")

     Gender               Race     Age
7022   Male              White (10,30]
3223 Female Hispanic/Latino(a) (30,50]
447    Male              White (10,30]
6750   Male              White (10,30]
5255   Male              White (10,30]
9689   Male              White (10,30]

I would like to create a contingency table that would give me a result like that:

                  Race
Age      Gender   Black/African American Hispanic/Latino(a) White     
(10,30]  Female                      1                  1     2
         Male                        2                  6     7
(30,50]  Female                      0                  2     1
         Male                        1                  4     1
(50,100] Female                      0                  0     0
         Male                        1                  0     1

I tried using table on three variable using:

table(df[,c('Age','Gender','Race')])

But I got the following result:

, , Age = (10,30]

        Race
Gender   Black/African American Hispanic/Latino(a) White
  Female                      1                  1     2
  Male                        2                  6     7

, , Age = (30,50]

        Race
Gender   Black/African American Hispanic/Latino(a) White
  Female                      0                  2     1
  Male                        1                  4     1

, , Age = (50,100]

        Race
Gender   Black/African American Hispanic/Latino(a) White
  Female                      0                  0     0
  Male                        1                  0     1

I also tried to use interaction:

table(interaction(df$Age, df$Gender), df$Race)

I got the following result:

                  Black/African American Hispanic/Latino(a) White
  (10,30].Female                       1                  1     2
  (30,50].Female                       0                  2     1
  (50,100].Female                      0                  0     0
  (10,30].Male                         2                  6     7
  (30,50].Male                         1                  4     1
  (50,100].Male                        1                  0     1

Which are not so bad, but still not as beautiful as I'd like.

I hope I was clear, Thanks you very much for your help!

1

There are 1 best solutions below

1
On
ftable(df, row.vars = c(3,1))

                Race Black/African American Hispanic/Latino(a) White
Age      Gender                                                     
(10,30]  Female                           1                  1     2
         Male                             2                  6     7
(30,50]  Female                           0                  2     1
         Male                             1                  4     1
(50,100] Female                           0                  0     0
         Male                             1                  0     1

or even

ftable(df[,c('Age','Gender','Race')])