我对R很新,我有一个循环,有时会产生这样的矩阵:
1 2
FALSE 0 0
TRUE 0 2
我需要做如下: 如果单行中的两个单元格为零,则将它们替换为0.5 如果其中一个单元格不是零除以行的总和
所以结果将是:
1 2
FALSE 0.5 0.5
TRUE 0 1
请问好吗? 谢谢
答案 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