7

I'd like to convert a matrix of values into a matrix of 'bits'.

I have been looking for solutions and found this, which seems to be part of a solution. I'll try to explain what I am looking for. I have a matrix like

> 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

which I would like to convert into

     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

so for each value in the row a "1" in the corresponding column.

If I use

> 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

this is close to what I am looking for, but returns a line for each value.

I would only need to consolidate all values from one row into one row. Because a

> 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 

gives alls values of the whole table, so what do I need to do to get the values per row.

2
  • 1
    What if there are two equal integers in the same row? Commented Jul 17, 2016 at 16:01
  • That conceptionally not the case. Commented Jul 17, 2016 at 16:57

4 Answers 4

4

Here is another option using table() function:

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
Sign up to request clarification or add additional context in comments.

Comments

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

Comments

4

Let

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

One approach would be

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

In one line:

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

Following your approach, and similarly to @Psidom's suggestion:

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

Comments

2

We can use the reshape2 package.

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)

which gives us this

  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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.