Có nhiều cách để thực hiện việc này. Câu trả lời này bắt đầu với những cách yêu thích của tôi, nhưng cũng thu thập nhiều cách khác nhau từ câu trả lời cho các câu hỏi tương tự nằm rải rác xung quanh trang web này.
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))
Sử dụng reshape2:
library(reshape2)
acast(tmp, x~y, value.var="z")
Sử dụng ma trận lập chỉ mục:
with(tmp, {
out <- matrix(nrow=nlevels(x), ncol=nlevels(y),
dimnames=list(levels(x), levels(y)))
out[cbind(x, y)] <- z
out
})
Sử dụng xtabs
:
xtabs(z~x+y, data=tmp)
Bạn cũng có thể sử dụng reshape
, theo đề nghị của mình e: Convert table into matrix by column names, mặc dù bạn phải thực hiện một thao tác nhỏ sau đó để xóa một cột phụ và lấy tên đúng (không được hiển thị).
> 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
Ngoài ra còn có sparseMatrix
trong gói Matrix
, như đã thấy ở đây: 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
Các daply
chức năng từ thư viện plyr
cũng có thể được sử dụng, như ở đây: 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
từ reshape2 cũng hoạt động, như ở đây: Reshape data for values in one column, nhưng bạn nhận được một data.frame với một cột cho giá trị x
.
> dcast(tmp, x~y, value.var="z")
x a b c
1 x 1 2 3
2 y 3 3 2
Tương tự, spread
từ "tidyr" cũng sẽ làm việc cho một sự chuyển hóa như:
library(tidyr)
spread(tmp, y, z)
# x a b c
# 1 x 1 2 3
# 2 y 3 3 2
@AnandaMahto cũng có một câu trả lời tuyệt vời về điều này ở đây: http : //stackoverflow.com/a/14515736/210673 – Aaron