преобразование таблицы в матрицу - PullRequest
1 голос
/ 03 декабря 2009

Возьмем, к примеру, следующую таблицу

height <- c(rep('short', 7), rep('tall', 3))
girth <- c(rep('narrow', 4), rep('wide', 6))
measurement <- rnorm(10)
foo <- data.frame(height=height, girth=girth, measurement=measurement)
ftable.result <- ftable(foo$height, foo$girth)

Я бы хотел преобразовать вышеприведенные ftable.result в матрицу с именами строк и столбцов. Есть ли эффективный способ сделать это? as.matrix() не совсем работает, так как он не прикрепит имена строк и столбцов для вас.

Вы можете сделать следующее

ftable.matrix <- ftable.result
class(ftable.matrix) <- 'matrix'

rownames(ftable.matrix) <- unlist(attr(ftable.result, 'row.vars'))
colnames(ftable.matrix) <- unlist(attr(ftable.result, 'col.vars'))

Тем не менее, это кажется немного жестким. Есть ли более эффективный способ сделать это?

Ответы [ 2 ]

2 голосов
/ 23 июля 2014

Оказывается, что @Shane первоначально опубликовал (но быстро удалил), что является правильным ответом с более поздними версиями R.

Где-то на этом пути для ftable был добавлен метод as.matrix (хотя я не нашел его в файлах NEWS, которые я прочитал.

Метод as.matrix для ftable позволяет вам довольно хорошо справляться с «вложенными» частотными таблицами (это то, что ftable создает довольно красиво). Учтите следующее:

temp <- read.ftable(textConnection("breathless yes no
coughed yes no
age
20-24  9  7  95 1841
25-29 23  9 108 1654
30-34 54 19 177 1863"))

class(temp)
# [1] "ftable"

Трюк head(as.table(...), Inf) не работает с таким ftables, потому что as.table преобразует результат в многомерный массив.

head(as.table(temp), Inf)
#  [1]    9   23   54   95  108  177    7    9   19 1841 1654 1863

По той же причине второе предложение также не работает:

t <- as.table(temp)
class(t) <- "matrix"
# Error in class(t) <- "matrix" : 
#   invalid to set the class to matrix unless the dimension attribute is of length 2 (was 3)

Однако, с более свежими версиями R, просто использовать as.matrix было бы хорошо:

as.matrix(temp)
#        breathless_coughed
# age     yes_yes yes_no no_yes no_no
#   20-24       9      7     95  1841
#   25-29      23      9    108  1654
#   30-34      54     19    177  1863

class(.Last.value)
# [1] "matrix"

Если вы предпочитаете data.frame вместо matrix, посмотрите table2df из моего пакета "mrdwabmisc" на GitHub .

2 голосов
/ 04 декабря 2009

Я нашел 2 решения в R-Help :

head(as.table(ftable.result), Inf)

или

t <- as.table(ftable.result)
class(t) <- "matrix"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...