如何将表转换为数据框

Vic*_*Hee 150 r

我在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"
Run Code Online (Sandbox Code Playgroud)

当我打印它时看起来像这样:

                    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
Run Code Online (Sandbox Code Playgroud)

我想摆脱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
Run Code Online (Sandbox Code Playgroud)

我可能从根本上不了解表与数据帧的关系.

Vic*_*Hee 288

我已经弄清楚了:

as.data.frame.matrix(mytable) 
Run Code Online (Sandbox Code Playgroud)

做我需要的 - 显然,表需要以某种方式转换为矩阵,以便适当地转换为数据框.我在Computational Ecology博客上找到了关于这个偶然表的as.data.frame.matrix()函数的更多细节.

  • 或者只是`as.data.frame(mytable)`.(`is.matrix(mytable)`将显示表真的只是打扮矩阵,`as.data.frame.matrix`是当`as.data.frame()`传递给矩阵时调度的方法参数). (29认同)
  • Josh - 在顶部显示的例子中,as.data.frame(mytable)没有'工作 - 这就是为什么Victor问这个问题,我想?你能澄清一下吗? (15认同)
  • @HeatherStark我怀疑这是因为它实际上是`as.data.frame.table`正在被调度,而不是那个不太具体的`as.data.frame.matrix`. (4认同)
  • 非常好的发现.我唯一不喜欢的是我的xtab因子(第一个"列")变成`row.names`.我设法使用`row.names`值添加一个列,但我宁愿首先阻止`as.data.frame.matrix`编写`row.names`. (3认同)

BLT*_*BLT 12

虽然结果在这种情况下有所不同,因为列名是数字,我使用的另一种方式是data.frame(rbind(mytable)).使用@XX中的示例:

> 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
Run Code Online (Sandbox Code Playgroud)

如果列名称不以数字开头,则不X会将它们添加到它们的前面.


X.X*_*X.X 11

简短回答: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
Run Code Online (Sandbox Code Playgroud)


Ben*_*Ben 7

如果您使用的是tidyverse,则可以使用

as_data_frame(table(myvector))
Run Code Online (Sandbox Code Playgroud)

得到一个tibble(即一个与基类有一些微小变化的数据框)