Hay muchas formas de hacerlo. Esta respuesta comienza con mis formas favoritas, pero también recopila varias formas de respuestas a preguntas similares diseminadas por este sitio.
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))
Usando reshape2:
library(reshape2)
acast(tmp, x~y, value.var="z")
Utilizando la matriz de indexación:
with(tmp, {
out <- matrix(nrow=nlevels(x), ncol=nlevels(y),
dimnames=list(levels(x), levels(y)))
out[cbind(x, y)] <- z
out
})
Usando xtabs
:
xtabs(z~x+y, data=tmp)
También puede utilizar reshape
, como su sugerido e: Convert table into matrix by column names, aunque después tiene que hacer una pequeña manipulación para eliminar columnas adicionales y obtener los nombres correctos (no se muestran).
> 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
También hay sparseMatrix
dentro del paquete Matrix
, como se ve aquí: R - convert BIG table into matrix by column names
> 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
La función daply
de la biblioteca plyr
también podrían utilizarse, como en este caso: https://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 también funciona, como aquí: Reshape data for values in one column, pero obtienes un data.frame con una columna para el valor x
.
> dcast(tmp, x~y, value.var="z")
x a b c
1 x 1 2 3
2 y 3 3 2
Del mismo modo, spread
de "tidyr" también funcionaría para dicha transformación:
library(tidyr)
spread(tmp, y, z)
# x a b c
# 1 x 1 2 3
# 2 y 3 3 2
@AnandaMahto también tiene una gran respuesta de esto aquí: http : //stackoverflow.com/a/14515736/210673 – Aaron