Como converter uma tabela em um quadro de dados


167

Eu tenho uma tabela em R que tem str()isso:

 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 fica assim quando eu imprimi-lo:

                    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

Eu quero livrar-se do xe ye convertê-lo em um quadro de dados que parece exatamente o mesmo que o acima (três linhas, quatro colunas), mas sem o xou y. Se eu usar as.data.frame(mytable), em vez disso, recebo o seguinte:

                    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

Provavelmente, fundamentalmente, não entendo como as tabelas se relacionam aos quadros de dados.


2
Ao pesquisar, fiquei surpreso com a dificuldade de encontrar uma pergunta semelhante no SO. Aqui está um: stackoverflow.com/questions/5855225/... É uma manobra bastante básico e descrito em ?xtabs(não que é necessariamente o local mais óbvio.)
IRTFM

Certeza que tudo que você precisa fazer é definir deparse.level = 0(ou possivelmente 2) na chamada paratable
rico Scriven

Respostas:


322

Eu já descobri isso:

as.data.frame.matrix(mytable) 

faz o que eu preciso - aparentemente, a tabela precisa de alguma forma ser convertida em uma matriz para ser adequadamente traduzida em um quadro de dados. Encontrei mais detalhes sobre essa função as.data.frame.matrix () para tabelas de contingência no blog Computational Ecology .


31
Ou apenas as.data.frame(mytable). ( is.matrix(mytable)Revelará que as tabelas realmente estão apenas vestida matrizes, e as.data.frame.matrixé o método que é despachado quando as.data.frame()é passado um argumento de matriz.)
Josh O'Brien

16
Josh - no exemplo mostrado na parte superior, as.data.frame (mytable) não funcionou - é por isso que Victor estava fazendo a pergunta, pensei? Você poderia esclarecer?
Heather Stark

4
@HeatherStark Suspeito que isso ocorra porque, na verdade, as.data.frame.tableestá sendo despachado, e não menos específico as.data.frame.matrix.
jbaums

3
muito bom achado. a única coisa que não gosto é que meus fatores xtab (primeira "coluna") se transformam row.names. Eu consegui adicionar uma coluna usando os row.namesvalores, mas prefiro evitar as.data.frame.matrixescrever row.namesem primeiro lugar. #
Thieme Hennis

as.data.frame.matrix(table(x))me dá Error in seq_len(ncols) : argument must be coercible to non-negative integer, enquanto as.data.frame(table(x))obras, onde xé apenas um vetor numéricoc(1,2,...)
PatrickT

16

Embora os resultados variem neste caso, porque os nomes das colunas são números, outra maneira que usei é data.frame(rbind(mytable)). Usando o exemplo de @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 os nomes das colunas não começarem com números, Xeles não serão adicionados à frente deles.


Isso também está realmente funcionando melhor que as.data.frame.matrix no meu exemplo que retorna um erro: out <- structure (c (zone1 = 1208160L, zone2 = 1126841L, zone3 = 2261808L, zone4 = 1827557L, zone5 = 1038999L, zone6 = 353569L, zona7 = 351484L, zona8 = 441930L, zona9 = 25266L, zonaNA = 14751L), .Dim = 10L, .Dimnames = list (c ("zona1", "zona2", "zona3", "zona4", "zona5 "," zone6 "," zone7 "," zone8 "," zone9 "," zoneNA ")), classe =" tabela ")> as.data.frame.matrix (out) Erro em d [[2L]]: subscrito fora dos limites
cmbarbu 4/06

11

Resposta curta: usando as.data.frame.matrix(mytable), como @Victor Van Hee sugeriu.

Resposta longa: as.data.frame(mytable)pode não funcionar em tabelas de contingência geradas por table()função, mesmo que is.matrix(your_table)retorne TRUE. Ele ainda derreterá a tabela no factor1 factor2 factori countsformato.

Exemplo:

> 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 você estiver usando o tidyverse , poderá usar

as_data_frame(table(myvector))

para obter um petisco (ou seja, um quadro de dados com algumas pequenas variações da classe base)


Depende do que você quer trabalhar com dataframes ou Tibbles
Dimitrios Zacharatos

-1

Isso é privar

as.data.frame (minha tabela)

Em vez disso, use este

biblioteca ("quanteda")

converter (mytable, para = "data.frame")


1
convertnão faz parte da distribuição R normal. Eu tenho De could not find function "convert"que biblioteca você precisa para isso?
Mark Lakata

biblioteca ("quanteda")
Odeyinka Olubunmi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.