在R中的矩阵中每行保留一个最大值

时间:2014-09-26 03:11:56

标签: r k-means

我有一个像这样的矩阵:

     [,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

即每行随机保留一个最大值(连接应随机断开,只保留一个最大值)并使除零之外的所有条目。任何人都可以为我提供一个代码片段来解决这个问题。

2 个答案:

答案 0 :(得分:2)

如果mat是您的原始矩阵,

创建一个充满零的空矩阵,其大小正确且暗淡

ret <- matrix(rep(0, length(mat)), ncol=ncol(mat))

将所需值分配给1.请注意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))