Come convertire una tabella in un frame di dati


167

Ho una tabella in R che ha str()questo:

 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"

E appare così quando lo stampo:

                    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

Voglio eliminare il xed ye convertirlo in un frame di dati che sembra esattamente lo stesso come sopra (tre righe, quattro colonne), ma senza la xo y. Se uso as.data.frame(mytable), invece ottengo questo:

                    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

Probabilmente fondamentalmente non capisco come le tabelle si collegano ai frame di dati.


2
Durante la ricerca sono rimasto sorpreso dalla difficoltà a trovare una domanda simile su SO. Eccone uno: stackoverflow.com/questions/5855225/… È una manovra piuttosto semplice e descritta in ?xtabs(non che sia necessariamente la posizione più ovvia.)
IRTFM,

Abbastanza sicuro che tutto ciò che devi fare è impostare deparse.level = 0(o possibilmente 2) nella chiamata atable
Rich Scriven

Risposte:


322

L'ho già capito:

as.data.frame.matrix(mytable) 

fa quello di cui ho bisogno - apparentemente, la tabella deve in qualche modo essere convertita in una matrice per essere opportunamente tradotta in un frame di dati. Ho trovato maggiori dettagli su questa funzione as.data.frame.matrix () per le tabelle di contingenza sul blog di ecologia computazionale .


31
O semplicemente as.data.frame(mytable). ( is.matrix(mytable)rivelerà che le tabelle sono davvero solo matrici vestite, ed as.data.frame.matrixè il metodo che viene inviato quando as.data.frame()viene superato un argomento matrice.)
Josh O'Brien,

16
Josh - nell'esempio mostrato in alto, as.data.frame (mytable) non ha funzionato - ecco perché Victor stava ponendo la domanda, ho pensato? Potresti chiarire?
Heather Stark,

4
@HeatherStark Ho il sospetto che ciò sia dovuto al fatto as.data.frame.tableche viene inviato, piuttosto che a quello meno specifico as.data.frame.matrix.
jbaums,

3
molto bella scoperta. l'unica cosa che non mi piace è che i miei fattori xtab (prima "colonna") si trasformano in row.names. Sono riuscito ad aggiungere una colonna usando i row.namesvalori, ma preferisco evitare di as.data.frame.matrixscrivere row.namesin primo luogo ..
Thieme Hennis,

as.data.frame.matrix(table(x))mi dà Error in seq_len(ncols) : argument must be coercible to non-negative integer, mentre as.data.frame(table(x))funziona, dove xc'è solo un vettore numericoc(1,2,...)
Patrick T

16

Mentre i risultati variano in questo caso perché i nomi delle colonne sono numeri, un altro modo che ho usato è data.frame(rbind(mytable)). Utilizzando l'esempio di @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

Se i nomi delle colonne non iniziano con i numeri, Xnon verranno aggiunti in primo piano.


Questo funziona anche meglio di as.data.frame.matrix nel mio esempio che restituisce un errore: out <- struttura (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) Errore in d [[2L]]: pedice fuori limite
cmbarbu

11

Risposta breve: usando as.data.frame.matrix(mytable), come suggerito da @Victor Van Hee.

Risposta lunga: as.data.frame(mytable)potrebbe non funzionare su tabelle di contingenza generate dalla table()funzione, anche se is.matrix(your_table)restituisce TRUE. Continuerà a fondere la tua tabella nel factor1 factor2 factori countsformato.

Esempio:

> 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

Se stai usando il tidyverse , puoi usare

as_data_frame(table(myvector))

ottenere una tabella (cioè un frame di dati con alcune variazioni minori dalla classe base)


dipende da cosa vuoi lavorare con i frame di dati o le variabili
Dimitrios Zacharatos,

-1

Questo è deprivato

as.data.frame (mytable)

Invece usa questo

biblioteca ( "quanteda")

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


1
convertnon fa parte della normale distribuzione R. Ho di could not find function "convert"quale biblioteca hai bisogno per questo?
Mark Lakata,

biblioteca ("quanteda")
Odeyinka Olubunmi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.