Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Converting an ftable (contingency table) to a dataframe in R

Tags:

dataframe

r

I am generating an ftable (by running ftable on the results of a xtabs command) and I am getting the following.

                                                                   Var1   Var2
date                 group                                                 
2007-01-01           q1                                              1     9
                     q2                                              2     8
                     q3                                              3     7
2007-01-02           q1                                              6     6
                     q2                                              7     5
                     q3                                              8     4

I understand that it is a ftable class but I'd like to store is as the following. I am wondering if there is any efficient way of doing it in R?

date                 group                                         Var1   Var2          
2007-01-01           q1                                              1     9
2007-01-01           q2                                              2     8
2007-01-01           q3                                              3     7
2007-01-02           q1                                              6     6
2007-01-02           q2                                              7     5
2007-01-02           q3                                              8     4
like image 301
Mark Avatar asked Jun 24 '11 02:06

Mark


People also ask

Which R command can be used to produce the above contingency table?

table() command can be used to create contingency tables in R because the command can handle data in simple vectors or more complex matrix and data frame objects. The more complex the original data, the more complex is the resulting contingency table.

What is Ftable in R?

ftable() , short for "flatten table," is a function in R that creates a flat contingency table.


1 Answers

you can do that work by:

> # from ?ftable
> r <- ftable(Titanic, row.vars = 1:3)
> r
                   Survived  No Yes
Class Sex    Age                   
1st   Male   Child            0   5
             Adult          118  57

... snip ...

      Female Child            0   0
             Adult            3  20
> 
> # long format
> as.data.frame(r)
   Class    Sex   Age Survived Freq
1    1st   Male Child       No    0
2    2nd   Male Child       No    0
3    3rd   Male Child       No   35

... snip ...

30   2nd Female Adult      Yes   80
31   3rd Female Adult      Yes   76
32  Crew Female Adult      Yes   20
> 
> # wide format, but do not care the col name
> data.frame(expand.grid(rev(attr(r, "row.vars"))), unclass(r))
     Age    Sex Class  X1  X2
1  Child   Male   1st   0   5
2  Adult   Male   1st 118  57
3  Child Female   1st   0   1

... snip ...

14 Adult   Male  Crew 670 192
15 Child Female  Crew   0   0
16 Adult Female  Crew   3  20
> 
> # using reshape2 library
> library(reshape2)
> dcast(as.data.frame(r), as.formula(paste(paste(names(attr(r, "row.vars")), collapse="+"), "~", paste(names(attr(r, "col.vars"))))))
Using Freq as value column: use value_var to override.
   Class    Sex   Age  No Yes
1    1st   Male Child   0   5
2    1st   Male Adult 118  57
3    1st Female Child   0   1

... snip ...

14  Crew   Male Adult 670 192
15  Crew Female Child   0   0
16  Crew Female Adult   3  20
like image 143
kohske Avatar answered Sep 18 '22 23:09

kohske