如何将值矩阵转换为二进制矩阵

时间:2016-07-17 15:38:50

标签: r matrix

我希望将值矩阵转换为'位的矩阵。

我一直在寻找解决方案并找到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

因此对于行a&#34; 1&#34;中的每个值。在相应的栏目中。

如果我使用

> 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 

给出了整个表的alls值,所以我需要做什么才能获得每行的值。

4 个答案:

答案 0 :(得分:4)

    bit_x = matrix(0, nrow = nrow(x), ncol = max(x))
    for (i in 1:nrow(x)) {bit_x[i,x[i,]] = 1}

答案 1 :(得分:4)

(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

答案 2 :(得分:4)

以下是使用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

答案 3 :(得分:2)

我们可以使用 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