200 votes

Comment convertir un tableau en cadre de données

J'ai un tableau 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 veux me débarrasser de la x y y et le convertir en un cadre de données qui ressemble exactement à ce qui précède (trois lignes, quatre colonnes), mais sans l'élément x o y . Si j'utilise as.data.frame(mytable) Au lieu de cela, j'obtiens 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 comment les tableaux sont liés aux cadres de données.

2 votes

Lors de mes recherches, j'ai été surpris de constater à quel point il était difficile de trouver une question similaire sur SO. En voici une : stackoverflow.com/questions/5855225/ C'est une manœuvre assez basique et décrite dans ?xtabs (ce n'est pas nécessairement l'endroit le plus évident).

0 votes

Je suis sûr que tout ce que vous devez faire est de mettre deparse.level = 0 (ou éventuellement 2) dans l'appel à table

376voto

Victor Van Hee Points 3076

Je l'ai déjà compris :

as.data.frame.matrix(mytable) 

fait ce dont j'ai besoin -- apparemment, le tableau doit être converti en une matrice pour pouvoir être traduit de manière appropriée en un cadre de données. J'ai trouvé plus de détails à ce sujet Fonction as.data.frame.matrix() pour les tableaux de contingence sur le blog Computational Ecology .

37 votes

Ou juste as.data.frame(mytable) . ( is.matrix(mytable) révélera que les tableaux ne sont en fait que des matrices habillées, et as.data.frame.matrix est la méthode qui est envoyée lorsque as.data.frame() est passé un argument de matrice).

20 votes

Josh - dans l'exemple montré en haut, as.data.frame(mytable) ne fonctionne pas - c'est pourquoi Victor posait la question, je pensais ? Pourriez-vous préciser ?

5 votes

Je pense que c'est parce que c'est en fait as.data.frame.table qui est distribué, plutôt que le moins spécifique as.data.frame.matrix .

22voto

BLT Points 1428

Bien que les résultats varient dans ce cas parce que les noms de colonnes sont des nombres, une autre méthode que j'ai utilisée est la suivante 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 des colonnes ne commencent pas par des chiffres, la fonction X ne seront pas ajoutés à l'avant de ceux-ci.

14voto

X.X Points 356

Réponse courte : en utilisant as.data.frame.matrix(mytable) comme le suggère @Victor Van Hee.

Longue réponse : as.data.frame(mytable) peut ne pas fonctionner sur les tableaux de contingence générés par table() même si is.matrix(your_table) renvoie à TRUE . Il va quand même faire fondre votre table dans le factor1 factor2 factori counts format.

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

8voto

Ben Points 8166

Si vous utilisez le tidyverse vous pouvez utiliser

as_data_frame(table(myvector))

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

-3voto

Cette fonction est obsolète :

as.data.frame(my_table)

Utilisez plutôt ce paquet :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X