如何将矩阵除以行的总和,它有零

时间:2018-03-20 18:40:29

标签: r matrix

我对R很新,我有一个循环,有时会产生这样的矩阵:

        1 2
  FALSE 0 0
  TRUE  0 2

我需要做如下: 如果单行中的两个单元格为零,则将它们替换为0.5 如果其中一个单元格不是零除以行的总和

所以结果将是:

         1    2
  FALSE 0.5 0.5
  TRUE  0    1

请问好吗? 谢谢

3 个答案:

答案 0 :(得分:1)

如果您的矩阵是x

(x <- matrix(c(0, 0, 0, 2), 2))
#      [,1] [,2]
# [1,]    0    0
# [2,]    0    2    

zero_rows <- as.logical(rowSums(x != 0))
x[zero_rows,] <- x[zero_rows,]/sum(x[zero_rows,])
x[rowSums(x) == 0, ] <- rep(0.5, ncol(x))
    x
#      [,1] [,2]
# [1,]  0.5  0.5
# [2,]  0.0  1.0

这适用于任意大小的矩阵(二维数组)

@ akrun建议编辑,使用zero_rows而不是rowSums(x != 0)构建apply(x, 1, function(r) 0 %in% r)应该可以提高效率。

答案 1 :(得分:1)

x <- matrix(c(0, 0, 0, 2), 2))

 t(apply(x,1,function(y)if(all(!y))replace(y,!y,0.5)else if(any(!y))y/sum(y) else y))
     [,1] [,2]
[1,]  0.5  0.5
[2,]  0.0  1.0

答案 2 :(得分:0)

x = matrix(c(0, 0, 0, 2), 2)

t(apply(x, 1L, function(y) ifelse(all(y == 0), return(rep(0.5, length(y))), return(y/sum(y)))))
#     [,1] [,2]
#[1,]  0.5  0.5
#[2,]  0.0  1.0