如何将表转换为数据帧

我在R中有一个有str()的表:

 table [1:3, 1:4] 0.166 0.319 0.457 0.261 0.248 ...
- attr(*, "dimnames")=List of 2
..$ x: chr [1:3] "Metro >=1 million" "Metro <1 million" "Non-Metro Counties"
..$ y: chr [1:4] "q1" "q2" "q3" "q4"

打印出来的时候是这样的:

                    y
x                           q1        q2        q3        q4
Metro >=1 million  0.1663567 0.2612212 0.2670441 0.3053781
Metro <1 million   0.3192857 0.2480012 0.2341030 0.1986102
Non-Metro Counties 0.4570341 0.2044960 0.2121102 0.1263597

我想摆脱xy,并将其转换为一个看起来与上面完全相同的数据帧(三行,四列),但没有xy。如果我使用as.data.frame(mytable),我会得到这样的结果:

                    x  y      Freq
1   Metro >=1 million q1 0.1663567
2    Metro <1 million q1 0.3192857
3  Non-Metro Counties q1 0.4570341
4   Metro >=1 million q2 0.2612212
5    Metro <1 million q2 0.2480012
6  Non-Metro Counties q2 0.2044960
7   Metro >=1 million q3 0.2670441
8    Metro <1 million q3 0.2341030
9  Non-Metro Counties q3 0.2121102
10  Metro >=1 million q4 0.3053781
11   Metro <1 million q4 0.1986102
12 Non-Metro Counties q4 0.1263597

我可能根本不理解表与数据帧的关系。

307619 次浏览

我已经想明白了:

as.data.frame.matrix(mytable)

显然,表格需要以某种方式转换为矩阵,以便适当地转换为数据帧。我找到了这个as.data.frame.matrix()函数用于列联表在计算生态博客的更多细节。

简单的回答:使用as.data.frame.matrix(mytable),就像@Victor Van Hee建议的那样。

长回答:as.data.frame(mytable)可能对由table()函数生成的列联表不起作用,即使is.matrix(your_table)返回TRUE。它仍然会将你的表分解为factor1 factor2 factori counts格式。

例子:

> freq_t = table(cyl = mtcars$cyl, gear = mtcars$gear)


> freq_t
gear
cyl  3  4  5
4  1  8  2
6  2  4  1
8 12  0  2


> is.matrix(freq_t)
[1] TRUE


> as.data.frame(freq_t)
cyl gear Freq
1   4    3    1
2   6    3    2
3   8    3   12
4   4    4    8
5   6    4    4
6   8    4    0
7   4    5    2
8   6    5    1
9   8    5    2
> as.data.frame.matrix(freq_t)
3 4 5
4  1 8 2
6  2 4 1
8 12 0 2

如果你正在使用tidyverse,你可以使用

as_data_frame(table(myvector))

来获得宠物猫(即一个数据帧,与基类有一些小的变化)

虽然由于列名是数字,本例中的结果有所不同,但我使用的另一种方法是data.frame(rbind(mytable))。使用来自@X的例子。X:

> freq_t = table(cyl = mtcars$cyl, gear = mtcars$gear)


> freq_t
gear
cyl  3  4  5
4  1  8  2
6  2  4  1
8 12  0  2


> data.frame(rbind(freq_t))
X3 X4 X5
4  1  8  2
6  2  4  1
8 12  0  2

如果列名不是以数字开头,X将不会被添加到列名前面。

这是不赞成的:

as.data.frame(my_table)

而是使用这个包:

library("quanteda")
convert(my_table, to="data.frame")