R中巨大矩阵的重新编码

标签 r data.table

我有一个巨大的矩阵,其值为 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/

相关文章:

用 tidyr 分隔时将 NA 替换为零?

R:错误消息---包错误: "functionName"未从当前命名空间解析

R ggplot geom_jitter 重复异常值

使用 R 中的 data.table 有效地 reshape 预测数据

r - data.table merge() with NA in by column

R data.table 选择 2 继续行来创建新表

r - 如何在 R 中制作列表列表?

r - ggsurvplot 关于置信区间的奇怪行为

r - 如何创建具有列子集的平均差异的列?

r - 根据与另一个表的关系填充缺失值