如何从 n x m 和 n x k 矩阵获得 m x k 矩阵

时间:2021-06-10 14:31:14

标签: r matrix

不确定如何指定问题,但说我有稀疏矩阵:

i<-c(1,5,2,4,2,2,8)
j<-c(2,5,3,2,4,2,4)
set.seed(1234)
x<-rpois(7,2)
M1<-sparseMatrix(i,j,x=x)
rownames(M1) <- c("g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8")
colnames(M1) <- c("c1", "c2", "c3", "c4", "c5")
M1<- drop0(M1)

给出

> M1 
8 x 5 sparse Matrix of class "dgCMatrix"
   c1 c2 c3 c4 c5
g1  .  .  .  .  .
g2  .  2  2  4  .
g3  .  .  .  .  .
g4  .  2  .  .  .
g5  .  .  .  .  2
g6  .  .  .  .  .
g7  .  .  .  .  .
g8  .  .  .  .  .

和另一个矩阵:

set.seed(1)
M2<-matrix(sample(0:3,24,replace=TRUE),nrow=8, ncol = 3)
rownames(M2) <- c("g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8")
colnames(M2) <- c("L1", "L2", "L3")

给出

> M2
   L1 L2 L3
g1  0  1  1
g2  3  1  1
g3  2  2  1
g4  0  2  2
g5  1  0  0
g6  0  0  2
g7  2  0  0
g8  2  1  0

我将如何通过 L (mxk) 对 c 的新矩阵进行单热化,以根据 g 找到 c 在 L 中的位置?我想得到:

> M2
   L1 L2 L3
c1  0  0  0
c2  1  1  1
c3  1  1  1
c4  1  1  1
c5  1  0  0

哪里因为c2,c3,c4都共享g2,g2在L1,L2,L3中发现;然后 c2,c3,c4 也将跨越 L1-L3。由于 c5 只与 g5 相关联,而 g5 只在 L1 中,那么 c1 只在 L1 中。 我试图在 for 循环中使用 ifelse(),例如:

newMat <- Matrix(0, nrow = ncol(M1), ncol = ncol(M2))
for (i in 1:ncol(M1)){
  for (j in 1:ncol(M2)){
    newMat[i,j] <- ifelse(test = M2[i,j] > 0,
                              yes = 1,
                              no = 0)
  }
}

但这不是正确的方法......如果这个问题不清楚,抱歉。

1 个答案:

答案 0 :(得分:1)

也许你可以像下面这样尝试crossprod

> 1 * (crossprod(M1, M2) > 0)
5 x 3 Matrix of class "dgeMatrix"
   L1 L2 L3
c1  0  0  0
c2  1  1  1
c3  1  1  1
c4  1  1  1
c5  1  0  0

如果你想使用 for 循环,你可以试试

newMat <- Matrix(0,
  nrow = ncol(M1),
  ncol = ncol(M2),
  dimnames = list(colnames(M1), colnames(M2))
)
for (i in 1:ncol(M1)) {
  for (j in 1:ncol(M2)) {
    newMat[i, j] <- ifelse(sum(M1[, i] * M2[, j] != 0), 1, 0)
  }
}

给出

> newMat
5 x 3 sparse Matrix of class "dgCMatrix"
   L1 L2 L3
c1  .  .  .
c2  1  1  1
c3  1  1  1
c4  1  1  1
c5  1  .  .