不确定如何指定问题,但说我有稀疏矩阵:
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)
}
}
但这不是正确的方法......如果这个问题不清楚,抱歉。
答案 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 . .