Mark
Mark

Reputation: 10964

Converting an ftable (contingency table) to a dataframe in 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

Upvotes: 7

Views: 5618

Answers (2)

DM1
DM1

Reputation: 11

I know this question is old, but in case it helps someone:

ftable1 = ftable(Titanic, row.vars = 1:3)
library("metrumrg")
df1 = ftable2data.frame(ftable1)
df1
class(df1)

Upvotes: 0

kohske
kohske

Reputation: 66842

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

Upvotes: 16

Related Questions