以下面的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'))
然而,它似乎有点笨拙。有没有更有效的方法呢?
答案 0 :(得分:2)
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
。