我有一个巨大的矩阵,其值为 1、2 或 3(还有一些 NA)。如果矩阵是 n x m,那么我必须重新编码为 n x 3m,原始矩阵的每个值对应于新矩阵的 3 个条目。如果旧矩阵中的值为 x,则第 x 个条目将为 1,其他两个条目将为 0(如果 NA 全部为零)。
1, 3, NA, 1
被重新编码为
1 0 0 0 0 1 0 0 0 1 0 0
即
1 = 1 0 0
3 = 0 0 1
NA = 0 0 0
1 = 1 0 0
我必须在 R 中有效地完成此操作,因为矩阵很大。最有效的方法是什么?该矩阵位于 data.table 中。
最佳答案
具有预先分配的空矩阵。
mat <- matrix(c(1,3,NA,1,1,3,NA,1),nrow=2,byrow=TRUE)
mat
# [,1] [,2] [,3] [,4]
#[1,] 1 3 NA 1
#[2,] 1 3 NA 1
newmat <- matrix(0, ncol=ncol(mat)*3, nrow=nrow(mat))
ind <- cbind(rep(1:nrow(mat),ncol(mat)), as.vector(mat + (col(mat)*3-3)))
newmat[ind] <- 1
newmat
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
#[1,] 1 0 0 0 0 1 0 0 0 1 0 0
#[2,] 1 0 0 0 0 1 0 0 0 1 0 0
您还可以将此方法与 Matrix
包中的稀疏矩阵结合使用。
library(Matrix)
newmat <- Matrix(0, ncol=ncol(mat)*3, nrow=nrow(mat),sparse=TRUE)
newmat[ind[complete.cases(ind),]] <- 1
newmat
#2 x 12 sparse Matrix of class "dgCMatrix"
#
#[1,] 1 . . . . 1 . . . 1 . .
#[2,] 1 . . . . 1 . . . 1 . .
使用稀疏矩阵有很多优点,包括显着减少内存使用。
关于R中巨大矩阵的重新编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21842731/