如何将表转换为数据框


167

我在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

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


2
在搜索时,我很惊讶地发现关于SO的类似问题有多么困难。这里有一个:stackoverflow.com/questions/5855225/... 这是一个非常基本的机动和描述?xtabs(不是一定是最明显的位置。)
IRTFM

非常确定您需要做的所有事情deparse.level = 0(或可能为2)已设置为table
Rich Scriven

Answers:


322

我已经知道了:

as.data.frame.matrix(mytable) 

满足我的需要-显然,该表需要以某种方式转换为矩阵,以便适当地转换为数据帧。我在Computational Ecology博客上发现了有关列联表as.data.frame.matrix()函数的更多详细信息。


31
或者只是as.data.frame(mytable)。(这is.matrix(mytable)将揭示表实际上只是在修饰矩阵,并且as.data.frame.matrix是在as.data.frame()传递矩阵参数时调度的方法。)
Josh O'Brien 2012年

16
乔什-在上面显示的示例中,as.data.frame(mytable)无法正常工作-这就是为什么维克托问这个问题,我想吗?你能澄清一下吗?
希瑟·史塔克

4
@HeatherStark我怀疑这是因为实际上as.data.frame.table是正在派遣,而不是不太具体as.data.frame.matrix
jbaums

3
很不错的发现。我唯一不喜欢的是xtab因素(第一个“列”)变成了row.names。我已成功使用添加一列row.names值,但我宁愿防止as.data.frame.matrixrow.names在首位..
THIEME Hennis

as.data.frame.matrix(table(x))给我Error in seq_len(ncols) : argument must be coercible to non-negative integer,虽然as.data.frame(table(x))工作,但那里x只是一个数字矢量c(1,2,...)
PatrickT

16

尽管在这种情况下结果会有所不同,因为列名是数字,但我使用的另一种方法是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

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


在我返回错误的示例中,它实际上也比as.data.frame.matrix更好:out <-structure(c(zone1 = 1208160L,zone2 = 1126841L,zone3 = 2261808L,zone4 = 1827557L,zone5 = 1038999L,zone6 = 353569L,zone7 = 351484L,zone8 = 441930L,zone9 = 25266L,zoneNA = 14751L),. Dim = 10L,.Dimnames = list(c(“ zone1”,“ zone2”,“ zone3”,“ zone4”,“ zone5 “,” zone6“,” zone7“,” zone8“,” zone9“,” zoneNA“)),class =” table“)> as.data.frame.matrix(out)d [[2L]]中的错误:下标越界
cmbarbu

11

简短答案:使用as.data.frame.matrix(mytable)@Victor Van Hee建议的。

长答案:as.data.frame(mytable)可能对table()函数生成的列联表不起作用,即使is.matrix(your_table)return 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


-1

这太过分了

as.data.frame(mytable)

改用这个

convert(mytable,to =“ data.frame”)


1
convert不是正态R分布的一部分。我知道could not find function "convert"您需要什么图书馆?
Mark Lakata
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.