Cara mengonversi tabel ke bingkai data

167

Saya punya tabel di R yang memiliki str()ini:

 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"

Dan terlihat seperti ini ketika saya mencetaknya:

                    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

Saya ingin menyingkirkan xdan ydan mengubahnya menjadi sebuah frame data yang terlihat persis sama seperti di atas (tiga baris, empat kolom), tapi tanpa xatau y. Jika saya menggunakan as.data.frame(mytable), sebagai gantinya saya mendapatkan ini:

                    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

Saya mungkin pada dasarnya tidak mengerti bagaimana tabel berhubungan dengan frame data.

Victor Van Hee
sumber
2
Ketika mencari saya terkejut betapa sulitnya untuk menemukan pertanyaan serupa pada SO. Ini salah satunya: stackoverflow.com/questions/5855225/... Ini adalah manuver yang cukup mendasar dan dijelaskan dalam ?xtabs(bukan berarti lokasi yang paling jelas.)
IRTFM
Cukup yakin semua yang perlu Anda lakukan adalah mengatur deparse.level = 0(atau mungkin 2) dalam panggilan untuktable
Rich Scriven

Jawaban:

322

Saya sudah menemukan jawabannya:

as.data.frame.matrix(mytable) 

melakukan apa yang saya butuhkan - rupanya, tabel perlu entah bagaimana dikonversi ke matriks agar dapat diterjemahkan secara tepat ke dalam kerangka data. Saya menemukan detail lebih lanjut tentang fungsi as.data.frame.matrix () ini untuk tabel kontingensi di blog Computational Ecology .

Victor Van Hee
sumber
31
Atau adil as.data.frame(mytable). ( is.matrix(mytable)akan mengungkapkan bahwa tabel benar-benar hanya berpakaian matriks, dan as.data.frame.matrixmerupakan metode yang dikirim ketika as.data.frame()dilewati argumen matriks.)
Josh O'Brien
16
Josh - dalam contoh yang ditunjukkan di atas, as.data.frame (mytable) tidak bekerja - itu sebabnya Victor mengajukan pertanyaan, saya pikir? Bisakah Anda mengklarifikasi?
Heather Stark
4
@HeatherStark Saya menduga ini karena faktanya as.data.frame.tablesedang dikirim, bukan yang kurang spesifik as.data.frame.matrix.
jbaums
3
penemuan yang sangat bagus. satu-satunya hal yang saya sukai adalah faktor xtab saya ("kolom" pertama) berubah menjadi row.names. Saya telah berhasil menambahkan kolom menggunakan row.namesnilai - nilai, tetapi saya lebih suka mencegah as.data.frame.matrixpenulisan row.namesdi tempat pertama ..
Thieme Hennis
as.data.frame.matrix(table(x))memberi saya Error in seq_len(ncols) : argument must be coercible to non-negative integer, sambil as.data.frame(table(x))bekerja, di mana xhanya vektor numerikc(1,2,...)
PatrickT
16

Sementara hasilnya bervariasi dalam hal ini karena nama kolom adalah angka, cara lain yang saya gunakan adalah data.frame(rbind(mytable)). Menggunakan contoh dari @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

Jika nama kolom tidak dimulai dengan angka, maka Xtidak akan ditambahkan ke depannya.

BLT
sumber
Ini juga sebenarnya bekerja lebih baik daripada as.data.frame.matrix dalam contoh saya yang mengembalikan kesalahan: keluar <- struktur (c (zone1 = 1208160L, zone2 = 1126841L, zone3 = 2261808L, zone4 = 1827557L, zone5 = 1038999L, zone6 = 353569L, zone7 = 351484L, zone8 = 441930L, zone9 = 25266L, zoneNA = 14751L), .Dim = 10L, .Nama-nama = daftar (c ("zone1", "zone2", "zone3", "zone4", "zone5", "zone5", "zone5", "zone5", "," zone6 "," zone7 "," zone8 "," zone9 "," zoneNA ")), class =" table ")> as.data.frame.matrix (keluar) Kesalahan dalam d [[2L]]: subskrip di luar batas
cmbarbu
11

Jawaban singkat: menggunakan as.data.frame.matrix(mytable), seperti yang disarankan oleh @Victor Van Hee.

Jawaban panjang: as.data.frame(mytable)mungkin tidak berfungsi pada tabel kontingensi yang dihasilkan oleh table()fungsi, bahkan jika is.matrix(your_table)kembali TRUE. Itu masih akan mencairkan tabel Anda ke dalam factor1 factor2 factori countsformat.

Contoh:

> 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
XX
sumber
7

Jika Anda menggunakan tidyverse , Anda dapat menggunakan

as_data_frame(table(myvector))

untuk mendapatkan tibble (yaitu bingkai data dengan beberapa variasi kecil dari kelas dasar)

Ben
sumber
tergantung pada apa yang ingin Anda gunakan dengan kerangka data atau kerikil
Dimitrios Zacharatos
-1

Ini sulit

as.data.frame (mytable)

Alih-alih gunakan ini

perpustakaan ("quanteda")

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

Odeyinka Olubunmi
sumber
1
convertbukan bagian dari distribusi R normal. Saya punya could not find function "convert"perpustakaan apa yang Anda butuhkan untuk ini?
Mark Lakata
perpustakaan ("quanteda")
Odeyinka Olubunmi