151 votes

Remodeler le cadre de données à trois colonnes en matrice

J'ai un data.frame qui ressemble à ceci.

 x a 1 
x b 2 
x c 3 
y a 3 
y b 3 
y c 2 
 

Je veux ceci sous forme de matrice afin que je puisse le nourrir à heatmap pour faire un tracé. Le résultat devrait ressembler à quelque chose comme:

     a    b    c
x   1    2    3
y   3    3    2
 

J'ai essayé cast partir du paquetage reshape et j'ai essayé d'écrire une fonction manuelle pour le faire, mais je ne semble pas être capable de le faire correctement.

219voto

Aaron Points 15093

Il y a beaucoup de façons de le faire. Cette réponse commence par mes façons préférées, mais aussi la collecte de diverses manières à partir de réponses à des questions similaires dispersés autour de ce site.

tmp <- data.frame(x=gl(2,3, labels=letters[24:25]),
                  y=gl(3,1,6, labels=letters[1:3]), 
                  z=c(1,2,3,3,3,2))

À l'aide de reshape2:

library(reshape2)
acast(tmp, x~y, value.var="z")

En utilisant la matrice d'indexation:

with(tmp, {
  out <- matrix(nrow=nlevels(x), ncol=nlevels(y),
                dimnames=list(levels(x), levels(y)))
  out[cbind(x, y)] <- z
  out
})

À l'aide de xtabs:

xtabs(z~x+y, data=tmp)

Vous pouvez également utiliser reshape, comme proposé ici: table de conversion dans la matrice sont les noms des colonnes, si vous avez à faire un peu de manipulation par la suite, de supprimer une des colonnes supplémentaires et d'obtenir les noms de droit (non représenté).

> reshape(tmp, idvar="x", timevar="y", direction="wide")
  x z.a z.b z.c
1 x   1   2   3
4 y   3   3   2

Il y a aussi sparseMatrix dans la Matrix paquet, comme on le voit ici: R - convertir GRANDE table dans la matrice sont les noms des colonnes

> with(tmp, sparseMatrix(i = as.numeric(x), j=as.numeric(y), x=z,
+                        dimnames=list(levels(x), levels(y))))
2 x 3 sparse Matrix of class "dgCMatrix"
  a b c
x 1 2 3
y 3 3 2

L' daply fonction de l' plyr bibliothèque peut également être utilisé, comme ici: http://stackoverflow.com/a/7020101/210673

> library(plyr)
> daply(tmp, .(x, y), function(x) x$z)
   y
x   a b c
  x 1 2 3
  y 3 3 2

dcast de reshape2 travaille aussi, comme ici: Remodeler les données pour les valeurs dans une colonne, mais vous obtenez un ensemble de données.cadre avec une colonne pour l' x de la valeur.

> dcast(tmp, x~y, value.var="z")
  x a b c
1 x 1 2 3
2 y 3 3 2

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