【问题标题】:how to convert a matrix of values into a binary matrix如何将值矩阵转换为二进制矩阵
【发布时间】:2016-07-17 15:38:49
【问题描述】:

我想将值矩阵转换为“位”矩阵。

我一直在寻找解决方案,发现this,这似乎是解决方案的一部分。 我将尝试解释我在寻找什么。 我有一个像

这样的矩阵
> x<-matrix(1:20,5,4)
> x
     [,1] [,2] [,3] [,4]
[1,]    1    6   11   16
[2,]    2    7   12   17
[3,]    3    8   13   18
[4,]    4    9   14   19
[5,]    5   10   15   20

我想转换成

     1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
  1  1 0 0 0 0 1 0 0 0  0  1  0  0  0  0  1  0  0  0  0
  2  0 1 0 0 0 0 1 0 0  0  0  1  0  0  0  0  1  0  0  0
  3  0 0 1 0 0 0 0 1 0  0  0  0  1  0  0  0  0  1  0  0
  4  0 0 0 1 0 0 0 0 1  0  0  0  0  1  0  0  0  0  1  0
  5  0 0 0 0 1 0 0 0 0  1  0  0  0  0  1  0  0  0  0  1

因此对于行中的每个值,对应列中的“1”。

如果我使用

> table(sequence(length(x)),t(x))

     1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
  1  1 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
  2  0 0 0 0 0 1 0 0 0  0  0  0  0  0  0  0  0  0  0  0
  3  0 0 0 0 0 0 0 0 0  0  1  0  0  0  0  0  0  0  0  0
  4  0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  1  0  0  0  0
  5  0 1 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
  6  0 0 0 0 0 0 1 0 0  0  0  0  0  0  0  0  0  0  0  0
  7  0 0 0 0 0 0 0 0 0  0  0  1  0  0  0  0  0  0  0  0
  8  0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  1  0  0  0
  9  0 0 1 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
  10 0 0 0 0 0 0 0 1 0  0  0  0  0  0  0  0  0  0  0  0
  11 0 0 0 0 0 0 0 0 0  0  0  0  1  0  0  0  0  0  0  0
  12 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  1  0  0
  13 0 0 0 1 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
  14 0 0 0 0 0 0 0 0 1  0  0  0  0  0  0  0  0  0  0  0
  15 0 0 0 0 0 0 0 0 0  0  0  0  0  1  0  0  0  0  0  0
  16 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  1  0
  17 0 0 0 0 1 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
  18 0 0 0 0 0 0 0 0 0  1  0  0  0  0  0  0  0  0  0  0
  19 0 0 0 0 0 0 0 0 0  0  0  0  0  0  1  0  0  0  0  0
  20 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  1

这与我正在寻找的内容接近,但为每个值返回一行。

我只需要将一行中的所有值合并为一行。 因为一个

> table(x)
x
 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 
 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 

给出整个表的所有值,那么我需要做什么来获取每行的值。

【问题讨论】:

  • 如果同一行有两个相等的整数怎么办?
  • 从概念上来说并非如此。

标签: r matrix


【解决方案1】:

这是使用table()函数的另一个选项:

table(row(x), x)
#   x
#    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#  1 1 0 0 0 0 1 0 0 0  0  1  0  0  0  0  1  0  0  0  0
#  2 0 1 0 0 0 0 1 0 0  0  0  1  0  0  0  0  1  0  0  0
#  3 0 0 1 0 0 0 0 1 0  0  0  0  1  0  0  0  0  1  0  0
#  4 0 0 0 1 0 0 0 0 1  0  0  0  0  1  0  0  0  0  1  0
#  5 0 0 0 0 1 0 0 0 0  1  0  0  0  0  1  0  0  0  0  1

【讨论】:

    【解决方案2】:
        bit_x = matrix(0, nrow = nrow(x), ncol = max(x))
        for (i in 1:nrow(x)) {bit_x[i,x[i,]] = 1}
    

    【讨论】:

      【解决方案3】:

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

      一种方法是

      M <- matrix(0, nrow(x), max(x))
      M[cbind(c(row(x)), c(x))] <- 1
      M
      #      [,1] [,2] [,3]
      # [1,]    1    0    0
      # [2,]    0    0    1
      

      一行:

      replace(matrix(0, nrow(x), max(x)), cbind(c(row(x)), c(x)), 1).
      

      按照您的方法,类似于@Psidom 的建议:

      table(rep(1:nrow(x), ncol(x)), x)
      #    x
      #     1 3
      #   1 2 0
      #   2 0 2
      

      【讨论】:

        【解决方案4】:

        我们可以使用 reshape2 包。

        library(reshape2)
        # At first we make the matrix you provided 
        x <- matrix(1:20, 5, 4)
        # then melt it based on first column
        da <- melt(x, id.var = 1)
        # then cast it
        dat <- dcast(da, Var1 ~ value, fill = 0, fun.aggregate = length)
        

        这给了我们这个

          Var1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
        1    1 1 0 0 0 0 1 0 0 0  0  1  0  0  0  0  1  0  0  0  0
        2    2 0 1 0 0 0 0 1 0 0  0  0  1  0  0  0  0  1  0  0  0
        3    3 0 0 1 0 0 0 0 1 0  0  0  0  1  0  0  0  0  1  0  0
        4    4 0 0 0 1 0 0 0 0 1  0  0  0  0  1  0  0  0  0  1  0
        5    5 0 0 0 0 1 0 0 0 0  1  0  0  0  0  1  0  0  0  0  1
        

        【讨论】:

          猜你喜欢
          • 2022-01-23
          • 2020-04-21
          • 1970-01-01
          • 2016-03-06
          • 2019-04-21
          • 2015-06-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-13
          相关资源
          最近更新 更多