web-dev-qa-db-fra.com

Comment convertir une table en un cadre de données

J'ai une table dans R qui a str() de ceci:

 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"

Et ça ressemble à ça quand je l’imprime:

                    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

Je souhaite supprimer les variables x et y et les convertir en un cadre de données identique à celui ci-dessus (trois lignes, quatre colonnes), mais sans la variable x ou y. Si j'utilise as.data.frame(mytable), j'obtiens plutôt ceci:

                    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

Je ne comprends probablement pas fondamentalement comment les tableaux se rapportent aux blocs de données.

144
Victor Van Hee

Je l'ai déjà compris:

as.data.frame.matrix(mytable) 

fait ce dont j'ai besoin - apparemment, la table doit être convertie en une matrice pour pouvoir être traduite correctement en un cadre de données. J'ai trouvé plus de détails sur ce fonction as.data.frame.matrix () pour les tables de contingence sur le blog Computational Ecology .

279
Victor Van Hee

Bien que les résultats varient dans ce cas car les noms des colonnes sont des nombres, j’utilise aussi data.frame(rbind(mytable)). En utilisant l'exemple 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 les noms de colonne ne commencent pas par des chiffres, la X ne sera pas ajoutée à leur tête.

11
BLT

Réponse courte: en utilisant as.data.frame.matrix(mytable), comme l'a suggéré @Victor Van Hee.

Réponse longue: as.data.frame(mytable) risque de ne pas fonctionner avec les tables de contingence générées par la fonction table(), même si is.matrix(your_table) renvoie TRUE. Cela fera toujours fondre votre table au format factor1 factor2 factori counts.

Exemple:

> 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
10
X.X

Si vous utilisez le tidyverse , vous pouvez utiliser

as_data_frame(table(myvector))

pour obtenir un tibble (c'est-à-dire un bloc de données avec quelques variations mineures par rapport à la classe de base)

6
Ben