【问题标题】:How to divide a matrix by the sum of rows and it has zeros如何将矩阵除以行的总和并且它有零
【发布时间】:2018-03-20 18:40:29
【问题描述】:

我对 R 很陌生,我有一个循环,有时会给出这样的矩阵:

        1 2
  FALSE 0 0
  TRUE  0 2

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

所以结果将是:

         1    2
  FALSE 0.5 0.5
  TRUE  0    1

有什么想法吗? 谢谢你

【问题讨论】:

  • 谢谢 Dan,但这解决了部分问题,第二行仍然有 0 2 作为原始矩阵。
  • 已修复。在抓住问题的第二部分之前,我抢先一步
  • 注意到绿色复选标记依次被授予所有 3 个答案:@Amani,仅供参考,您只能将绿色复选标记授予一个答案。通常,当在第一个答案之后提供其他答案时,您不想重新授予它,除非它们是实质性的改进。这从以前的答案中删除了奖金和复选标记。将其授予一个最佳答案,并倾向于较早的答案(而不是有人重构或组合较早答案的答案)。
  • 哦!谢谢丹告诉我,我不知道:|

标签: r matrix


【解决方案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 建议的编辑,用rowSums(x != 0) 而非apply(x, 1, function(r) 0 %in% r) 构造zero_rows 应该会更有效。

【讨论】:

  • 您可以使用rowSums 构造zero_rows,即!!rowSums(x != 0)
  • 哦,是的,太可爱了!添加编辑。不过,我将使用as.logical 而不是!! 转换为逻辑。因为我们不是打高尔夫球。
【解决方案2】:

x &lt;- 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

【讨论】:

  • 非常感谢 Dan 和 Onyambu!问题解决了!!
【解决方案3】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    相关资源
    最近更新 更多