テーブルをデータフレームに変換する方法


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、データフレームに変換し、その正確(3行、4列)上記と同じですが、なしのルックス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
リッチスクリヴン

回答:


322

私はすでにそれを理解しました:

as.data.frame.matrix(mytable) 

私が必要とすることを行います-どうやら、テーブルはデータフレームに適切に変換されるために、どういうわけかマトリックスに変換される必要があります。計算エコロジーブログで、分割表用のこのas.data.frame.matrix()関数の詳細を見つけました。


31
または単にas.data.frame(mytable)。(is.matrix(mytable)テーブルが実際にドレスアップされたマトリックスであり、マトリックス引数が渡さas.data.frame.matrixれたときにディスパッチされるメソッドであることを明らかにしas.data.frame()ます。)
Josh O'Brien

16
Josh-上の例では、as.data.frame(mytable)が機能しませんでした。それが、ビクターが質問をした理由だと思いましたか?明確にしてもらえますか?
ヘザースターク

4
@HeatherStarkこれは、as.data.frame.table具体的ではなく、実際にディスパッチされているためだと思いas.data.frame.matrixます。
jbaums 2014

3
とても素敵な発見。私が嫌いな唯一のことは、私のxtab係数(最初の「列」)がになることrow.namesです。私が使用して列を追加するために管理しているrow.names値を、私はむしろ防ぐas.data.frame.matrix書いてrow.names...最初の場所で
ティーメ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

この場合、列名が数値であるため結果は異なりますが、私が使用したもう1つの方法は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)Error in d [[2L]]:範囲外の添え字
cmbarbu

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

7

tidyverseを使用している場合は、

as_data_frame(table(myvector))

ティブルを取得する(つまり、基本クラスからいくつかのマイナーなバリエーションを持つデータフレーム)


データフレームまたはティブルで何を処理するかによって異なります
Dimitrios Zacharatos

-1

これは欠けている

as.data.frame(mytable)

代わりにこれを使用してください

convert(mytable、to = "data.frame")


1
convert通常のR分布の一部ではありません。これにはcould not find function "convert"どのライブラリが必要ですか?
Mark Lakata
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.