我有一个像这样的矩阵:
[,1] [,2] [,3]
[1,] 0 1 0
[2,] 1 1 0
[3,] 0 0 1
每行中的那些代表例如每行的最大值。我有矩阵
[,1] [,2] [,3]
[1,] 11 32 12
[2,] 16 16 14
[3,] 19 18 27
现在在第二行的这个矩阵中,我有两个相同的最大值(16),它被前一个矩阵的第二行中的两个1替换,现在我想删除行中的重复最大值一个矩阵,所以我需要的是这样的东西:
[,1] [,2] [,3]
[1,] 0 1 0
[2,] 1 0 0
[3,] 0 0 1
即每行随机保留一个最大值(连接应随机断开,只保留一个最大值)并使除零之外的所有条目。任何人都可以为我提供一个代码片段来解决这个问题。
答案 0 :(得分:2)
如果mat
是您的原始矩阵,
ret <- matrix(rep(0, length(mat)), ncol=ncol(mat))
which.max
通过选择第一个匹配项来打破平局。ret[ cbind(seq(nrow(mat)), apply(mat, 1, which.max)) ] <- 1
ret
[,1] [,2] [,3]
[1,] 0 1 0
[2,] 1 0 0
[3,] 0 0 1
或者,如果您真的想要随机分割关系,您可以使用类似这样的内容作为ret
的索引:
cbind(seq(nrow(mat)), apply(mat, 1, function(x)
sample(which(x == max(x)), 1)
))
答案 1 :(得分:2)
或者你可以使用。这会更快。
ret[cbind(seq_len(nrow(mat2)),max.col(mat2, "first"))] <- 1
ret
# [,1] [,2] [,3]
#[1,] 0 1 0
#[2,] 1 0 0
#[3,] 0 0 1
mat1 <- matrix(c(0,1,0, 1,1,0,0,0,1), ncol=3)
mat2 <- matrix(c(11,16,19, 32, 16, 18, 12, 14, 27), ncol=3)
ret <- matrix(0, ncol(mat1), nrow(mat1))