Существует много способов сделать это. Этот ответ начинается с моих любимых способов, но также собирает различные пути от ответов на похожие вопросы, разбросанные по этому сайту.
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))
Использование reshape2:
library(reshape2)
acast(tmp, x~y, value.var="z")
Использование матрицы индексирования:
with(tmp, {
out <- matrix(nrow=nlevels(x), ncol=nlevels(y),
dimnames=list(levels(x), levels(y)))
out[cbind(x, y)] <- z
out
})
Использование xtabs
:
xtabs(z~x+y, data=tmp)
Вы также можете использовать reshape
, как и предложил ей e: Convert table into matrix by column names, хотя вам придется немного манипулировать впоследствии, чтобы удалить дополнительные столбцы и получить правильные имена (не показаны).
> 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
Там также sparseMatrix
в Matrix
пакете, как показано здесь: 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
функция из plyr
библиотеки также могут быть использованы, так как здесь: 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
из reshape2 тоже произведение, как здесь: Reshape data for values in one column, но вы получите data.frame со столбцом для значения x
.
> dcast(tmp, x~y, value.var="z")
x a b c
1 x 1 2 3
2 y 3 3 2
Аналогично, spread
из «tidyr» также будет работать для такой трансформации:
library(tidyr)
spread(tmp, y, z)
# x a b c
# 1 x 1 2 3
# 2 y 3 3 2
@AnandaMahto также имеет большой ответ об этом здесь: HTTP : //stackoverflow.com/a/14515736/210673 – Aaron