将ftable转换为矩阵

时间:2009-12-03 20:35:03

标签: r matrix

以下面的ftable为例

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 个答案:

答案 0 :(得分:2)

我找到2 solutions on R-Help

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

t <- as.table(ftable.result)
class(t) <- "matrix"

答案 1 :(得分:2)

事实证明@Shane最初发布(但很快就删除了) 对于更新版本的R的正确答案。

在此过程中,为as.matrix添加了ftable方法(我还没有在我读过的新闻档案中找到它。

as.matrix的{​​{1}}方法让您可以很好地处理&#34;嵌套&#34;频率表(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

但是,对于更新版本的R,只需使用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) 即可:

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,请查看"mrdwabmisc" package on GitHub中的matrix