Istnieje wiele sposobów, aby to zrobić. Ta odpowiedź zaczyna się od moich ulubionych sposobów, ale zbiera różne sposoby odpowiedzi na podobne pytania rozproszone po tej stronie.
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))
Korzystanie reshape2:
library(reshape2)
acast(tmp, x~y, value.var="z")
Korzystanie indeksowanie matrix:
with(tmp, {
out <- matrix(nrow=nlevels(x), ncol=nlevels(y),
dimnames=list(levels(x), levels(y)))
out[cbind(x, y)] <- z
out
})
Korzystanie xtabs
:
xtabs(z~x+y, data=tmp)
Można również użyć reshape
, jak sugeruje jej e: Convert table into matrix by column names, ale musisz później wykonać trochę manipulacji, aby usunąć dodatkowe kolumny i uzyskać poprawne nazwy (nie pokazano).
> 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
Jest też sparseMatrix
wewnątrz opakowania Matrix
, jak widać tutaj: 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
daply
funkcja z biblioteki plyr
może być również używany, jak tutaj: 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
z reshape2 również działa, jak tutaj: Reshape data for values in one column, ale otrzymujesz data.frame z kolumną dla wartości x
.
> dcast(tmp, x~y, value.var="z")
x a b c
1 x 1 2 3
2 y 3 3 2
Podobnie spread
z „tidyr” będzie również pracować dla takiej transformacji:
library(tidyr)
spread(tmp, y, z)
# x a b c
# 1 x 1 2 3
# 2 y 3 3 2
@AnandaMahto ma również wielkie odpowiedzi na ten temat tutaj: http : //stackoverflow.com/a/14515736/210673 – Aaron