Following some discussion on R-help, I'd like to propose that an as.matrix method be added to those available for ftable objects. The reason for this is that there are a variety of situations where one needs to flatten a 3+ way table, but then use that for analysis as a matrix, not just for pretty-printing. There is an as.table method to turn the result back to a table, but an as.matrix
method is missing.

> methods(class="ftable")
[1] as.data.frame.ftable* as.table.ftable* format.ftable*
[4] head.ftable*          print.ftable tail.ftable*

   Non-visible functions are asterisked
>

The function below was proposed by William Dunlop:

# as.matrix method for flattened tables

# modified from Willaim Dunlop, <wdun...@tibco.com>, R-Help, 01-09-2014
as.matrix.ftable <- function(x, sep="_", ...) {
    makeDimNames <- function(vars) {
        structure(
list(do.call(paste, c(rev(expand.grid(rev(vars))), list(sep=sep)))),
            names = paste(collapse=sep, names(vars))
        )
    }
    structure(
        unclass(x),
        dimnames=c(makeDimNames(attr(x, "row.vars")),
                   makeDimNames(attr(x, "col.vars"))),
        row.vars=NULL,
        col.vars=NULL)
}

Some test cases:

> UCB <- UCBAdmissions
> as.matrix(ftable(Dept ~ Admit + Gender, data=UCB))
                 Dept
Admit_Gender        A   B   C   D   E   F
  Admitted_Male   512 353 120 138  53  22
  Admitted_Female  89  17 202 131  94  24
  Rejected_Male   313 207 205 279 138 351
  Rejected_Female  19   8 391 244 299 317
> as.matrix(ftable(Dept ~ ., data=UCB))
                 Dept
Admit_Gender        A   B   C   D   E   F
  Admitted_Male   512 353 120 138  53  22
  Admitted_Female  89  17 202 131  94  24
  Rejected_Male   313 207 205 279 138 351
  Rejected_Female  19   8 391 244 299 317
> as.matrix(ftable(Admit + Gender ~ Dept, data=UCB))
    Admit_Gender
Dept Admitted_Male Admitted_Female Rejected_Male Rejected_Female
   A           512              89           313              19
   B           353              17           207               8
   C           120             202           205             391
   D           138             131           279             244
   E            53              94           138             299
   F            22              24           351             317
> as.matrix(ftable(Admit ~ ., data=UCB))
           Admit
Gender_Dept Admitted Rejected
   Male_A        512      313
   Male_B        353      207
   Male_C        120      205
   Male_D        138      279
   Male_E         53      138
   Male_F         22      351
   Female_A       89       19
   Female_B       17        8
   Female_C      202      391
   Female_D      131      244
   Female_E       94      299
   Female_F       24      317
>

Related functions: The vcd package defines a more extensive suite of similar structable functions, including as.matrix.structable; however that function doesn't supply appropriate dimnames for
the dimensions.  Given as.matrix.ftable(), that is easy to correct:

# use as.matrix.ftable, but
# need to remove other attributes: dnames, split_vertical
library(vcd)
as.matrix.structable <- function(x, sep="_", ...) {
    structure(
        as.matrix.ftable(x, sep, ...),
        dnames = NULL,
        split_vertical = NULL
        )
}

Test:

> as.matrix(structable(Gender ~ Admit + Dept, data=UCB))
            Gender
Admit_Dept   Male Female
  Admitted_A  512     89
  Admitted_B  353     17
  Admitted_C  120    202
  Admitted_D  138    131
  Admitted_E   53     94
  Admitted_F   22     24
  Rejected_A  313     19
  Rejected_B  207      8
  Rejected_C  205    391
  Rejected_D  279    244
  Rejected_E  138    299
  Rejected_F  351    317
> as.matrix(structable(Gender + Admit ~ Dept, data=UCB))
    Gender_Admit
Dept Male_Admitted Male_Rejected Female_Admitted Female_Rejected
   A           512           313              89              19
   B           353           207              17               8
   C           120           205             202             391
   D           138           279             131             244
   E            53           138              94             299
   F            22           351              24             317
>

--
Michael Friendly     Email: friendly AT yorku DOT ca
Professor, Psychology Dept. & Chair, Quantitative Methods
York University      Voice: 416 736-2100 x66249 Fax: 416 736-5814
4700 Keele Street    Web:   http://www.datavis.ca
Toronto, ONT  M3J 1P3 CANADA

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to