minoo - 1 month ago 10

R Question

I have a matrix that is for example like this:

`rownames V1`

a 1

c 3

b 2

d 4

y 2

q 4

i 1

j 1

r 3

I want to make a Symmetric binary matrix that it's dimnames of that is the same as rownames of above matrix. I want to fill these matrix by 1 & 0 in such a way that 1 indicated placing variables that has the same number in front of it and 0 for the opposite situation.This matrix would be like

`dimnames a c b d y q i j r`

a 1 0 0 0 0 0 1 1 0

c 0 1 0 0 0 0 0 0 1

b 0 0 1 0 1 0 0 0 0

d 0 0 0 1 0 1 0 0 0

y 0 0 1 0 1 0 0 0 0

q 0 0 0 1 0 1 0 0 0

i 1 0 0 0 0 0 1 1 0

j 1 0 0 0 0 0 1 1 0

r 0 1 0 0 0 0 0 0 1

Anyone knows how can I do that?

Answer

Use `dist`

:

```
DF <- read.table(text = "rownames V1
a 1
c 3
b 2
d 4
y 2
q 4
i 1
j 1
r 3", header = TRUE)
res <- as.matrix(dist(DF$V1)) == 0L
#alternatively:
#res <- !as.matrix(dist(DF$V1))
#diag(res) <- 0L #for the first version of the question, i.e. a zero diagonal
res <- +(res) #for the second version, i.e. to coerce to an integer matrix
dimnames(res) <- list(DF$rownames, DF$rownames)
# 1 2 3 4 5 6 7 8 9
#1 1 0 0 0 0 0 1 1 0
#2 0 1 0 0 0 0 0 0 1
#3 0 0 1 0 1 0 0 0 0
#4 0 0 0 1 0 1 0 0 0
#5 0 0 1 0 1 0 0 0 0
#6 0 0 0 1 0 1 0 0 0
#7 1 0 0 0 0 0 1 1 0
#8 1 0 0 0 0 0 1 1 0
#9 0 1 0 0 0 0 0 0 1
```