Есть много способов сделать это. Этот ответ начинается с моих любимых способов, но также содержит различные варианты ответов на похожие вопросы, разбросанные по всему сайту.
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))
Использование тидиверса:
Крутой новый способ сделать это с spread
от Tidyr. Он возвращает фрейм данных, что, вероятно, и будет желать большинство читателей этого ответа. Однако для тепловой карты вам необходимо преобразовать ее в истинную матрицу.
library(tidyr)
spread(tmp, y, z)
## x a b c
## 1 x 1 2 3
## 2 y 3 3 2
Использование reshape2 :
Одним из первых шагов к tidyverse был пакет reshape2. Я все еще думаю, что для многих задач по изменению формы функции melt
и *cast
более понятны и просты, чем обратные пути.
Для получения матрицы используйте acast
:
library(reshape2)
acast(tmp, x~y, value.var="z")
## a b c
## x 1 2 3
## y 3 3 2
Или чтобы получить фрейм данных, используйте dcast
, как здесь: Изменение данных для значений в одном столбце .
dcast(tmp, x~y, value.var="z")
## x a b c
## 1 x 1 2 3
## 2 y 3 3 2
Использование plyr :
Между reshape2 и tidyverse появился plyr
с функцией daply
, как показано здесь: 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
Использование матричного индексирования:
Это своего рода старая школа, но это хорошая демонстрация матричного индексирования, которая может быть действительно полезна в определенных ситуациях.
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)
Использование разреженной матрицы:
В пакете Matrix
также есть sparseMatrix
, как показано здесь: R - преобразовать БОЛЬШУЮ таблицу в матрицу по именам столбцов
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
Использование reshape
:
Вы также можете использовать базовую функцию R reshape
, как предлагается здесь: Преобразовать таблицу в матрицу по именам столбцов , хотя впоследствии вам придется немного поработать, чтобы удалить дополнительные столбцы и получить имена правильные (не показаны).
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