2012-05-25 12 views
101

Tengo una tabla en I que tiene str() de esto:Cómo convertir una tabla a una trama de datos

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 se parece a esto cuando lo imprimo:

    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 

quiero Deshágase de x y y y conviértalo en un marco de datos que se ve exactamente igual al anterior (tres filas, cuatro columnas), pero sin x o y. Si uso as.data.frame(mytable), en vez me sale esto:

    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 

probablemente fundamentalmente no entiendo cómo las tablas se refieren a tramas de datos.

+2

Al buscar me sorprendió lo difícil que era encontrar una pregunta similar sobre SO. Aquí hay uno: http: //stackoverflow.com/questions/5855225/generate-a-vector-in-r-and-insert-it-in-a-stacked-frame Es una maniobra bastante básica y se describe en '? Xtabs' (no es necesariamente la ubicación más obvia). –

+0

Bastante seguro de que todo lo que necesita hacer es establecer 'deparse.level = 0' (o posiblemente 2) en la llamada a' table' –

Respuesta

205

lo he descubierto ya:

as.data.frame.matrix(mytable) 

hace lo que necesito - al parecer, la mesa debe ser convertido de alguna manera a una matriz con el fin de ser traducido adecuadamente en una trama de datos. Encontré más detalles en este as.data.frame.matrix() function for contingency tables at the Computational Ecology blog.

+26

O simplemente 'as.data.frame (mytable) '. ('is.matrix (mytable)' revelará que las tablas realmente son solo matrices disfrazadas, y 'as.data.frame.matrix' es el método que se despacha cuando' as.data.frame() 'se pasa una matriz argumento.) –

+11

Josh - en el ejemplo que se muestra en la parte superior, como.data.frame (mytable) didnt 'work - es por eso que Victor estaba haciendo la pregunta, pensé? ¿Podrías aclarar? –

+3

@HeatherStark Sospecho que esto se debe a que se está enviando 'as.data.frame.table', en lugar de' 'as.data.frame.matrix', que es menos específico. – jbaums

5

Respuesta corta: usando as.data.frame.matrix(mytable), como @Victor Van Hee sugirió.

Respuesta larga: as.data.frame(mytable) puede no funcionar en tablas de contingencia generados por table() función, aunque la is.matrix(your_table) vuelve TRUE. Todavía fundirá su tabla en el formato factor1 factor2 factori counts.

Ejemplo:

> 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 
2

Si está utilizando la tidyverse, puede utilizar

as_data_frame(table(myvector)) 

para obtener una (es decir, una trama de datos con algunas variaciones menores de la clase base) tibble

4

Aunque los resultados varían en este caso porque los nombres de las columnas son números, otra forma que he usado es data.frame(rbind(mytable)). Usando el ejemplo de @ 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 

Si los nombres de columna no empiezan con los números, el X no se agregarán al frente de ellos.

Cuestiones relacionadas