Ci sono molti modi per farlo. Questa risposta inizia con i miei metodi preferiti, ma raccoglie anche vari modi dalle risposte a domande simili sparse per questo sito.
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))
Utilizzando reshape2:
library(reshape2)
acast(tmp, x~y, value.var="z")
Utilizzando matrice indicizzazione:
with(tmp, {
out <- matrix(nrow=nlevels(x), ncol=nlevels(y),
dimnames=list(levels(x), levels(y)))
out[cbind(x, y)] <- z
out
})
Utilizzando xtabs
:
xtabs(z~x+y, data=tmp)
È anche possibile utilizzare reshape
, come il suo suggerito e: Convert table into matrix by column names, anche se in seguito devi fare una piccola manipolazione per rimuovere una colonna in più e ottenere i nomi corretti (non mostrati).
> 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
C'è anche sparseMatrix
all'interno del pacchetto Matrix
, come si vede qui: 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 daply
funzione dalla libreria plyr
potrebbe essere utilizzato anche, come in questo 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
da reshape2 funziona anche, come qui: Reshape data for values in one column, ma ottieni un data.frame con una colonna per il valore x
.
> dcast(tmp, x~y, value.var="z")
x a b c
1 x 1 2 3
2 y 3 3 2
Allo stesso modo, spread
da "tidyr" sarebbe anche lavorare per una tale trasformazione:
library(tidyr)
spread(tmp, y, z)
# x a b c
# 1 x 1 2 3
# 2 y 3 3 2
@AnandaMahto ha anche una grande risposta su questo qui: http : //stackoverflow.com/a/14515736/210673 – Aaron