Een tabel converteren naar een dataframe

Ik heb een tabel in R met str()hiervan:

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"

En ziet er zo uit als ik het afdruk:

                   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

Ik wil de Xen yverwijderen en converteren naar een dataframe dat er precies hetzelfde uitziet als het bovenstaande (drie rijen, vier kolommen), maar zonder de Xof y. Als ik as.data.frame(mytable)gebruik, krijg ik in plaats daarvan dit:

                   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

Ik begrijp waarschijnlijk fundamenteel niet hoe tabellen zich verhouden tot dataframes.


Antwoord 1, autoriteit 100%

Ik heb het al door:

as.data.frame.matrix(mytable) 

doet wat ik nodig heb — blijkbaar moet de tabel op de een of andere manier worden geconverteerd naar een matrix om op de juiste manier in een dataframe te worden vertaald. Ik heb meer details gevonden over deze as.data.frame .matrix() functie voor contingentietabellen op de Computational Ecology blog.


Antwoord 2, autoriteit 5%

Hoewel de resultaten in dit geval variëren omdat de kolomnamen getallen zijn, is data.frame(rbind(mytable))een andere manier die ik heb gebruikt. Gebruik het voorbeeld van @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

Als de kolomnamen niet met cijfers beginnen, wordt de Xniet vooraan toegevoegd.


Antwoord 3, autoriteit 3%

Kort antwoord: gebruik as.data.frame.matrix(mytable), zoals @Victor Van Hee suggereerde.

Lang antwoord: as.data.frame(mytable)werkt mogelijk niet op onvoorziene tabellen die zijn gegenereerd door de functie table(), zelfs als is.matrix(your_table)retourneert TRUE. Het zal je tabel nog steeds doen smelten in het formaat factor1 factor2 factori counts.

Voorbeeld:

> 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

Antwoord 4, autoriteit 2%

Als je de tidyversegebruikt, je kunt gebruiken

as_data_frame(table(myvector))

om een tibblete krijgen (dwz een dataframe met enkele kleine variaties van de basisklasse)


Antwoord 5

Dit is verouderd:

as.data.frame(my_table)

Gebruik in plaats daarvan dit pakket:

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

Other episodes