我有一个以下矩阵:-
matA <- matrix(c(0, 1, 1, 0, 0, 1,
1, 0, 0, 1, 1, 0,
1, 0, 0, 0, 1, 0,
0, 1, 0, 0, 0, 1,
0, 1, 1, 0, 0, 1,
1, 0, 0, 1, 1, 0),
nrow = 6, ncol = 6, byrow = TRUE)
实际矩阵相当大(请记住这一点(。
我有以下表格的清单
listA <- list(c(2, 3, 6), c(1, 4, 5), c(1, 5), c(2, 6), c(2, 3, 6), c(1, 4, 5))
现在,listA
指定了1
在矩阵中的位置。我用以下方式将这个矩阵转换为行标准化形式:-
rowsumz <- unlist(lapply(listA, length))
for(i in 1:nrow(matA)){
matA[i, listA[[i]]] <- matA[i, listA[[i]]]/rowsumz[i]
}
有没有更快的方法????
您可以尝试
matA / rowSums(matA)
或
matA / lengths(listA)
您将获得
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 0.0000000 0.3333333 0.3333333 0.0000000 0.0000000 0.3333333
[2,] 0.3333333 0.0000000 0.0000000 0.3333333 0.3333333 0.0000000
[3,] 0.5000000 0.0000000 0.0000000 0.0000000 0.5000000 0.0000000
[4,] 0.0000000 0.5000000 0.0000000 0.0000000 0.0000000 0.5000000
[5,] 0.0000000 0.3333333 0.3333333 0.0000000 0.0000000 0.3333333
[6,] 0.3333333 0.0000000 0.0000000 0.3333333 0.3333333 0.0000000