Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create lower triangle genetic distance matrix

Tags:

r

matrix

I have distance matrix like this

      1   2   3   4   5
A   0.1 0.2 0.3 0.5 0.6
B   0.7 0.8 0.9 1   1.1
C   1.2 1.3 1.4 1.5 1.6
D   1.7 1.8 1.9 2   2.1
E   2.2 2.3 2.4 2.5 2.6

and now I want to create lower triangle matrix like this

    1   2   3   4   5   A   B   C   D   E
1   0                                   
2   0.1 0                               
3   0.2 0.1 0                           
4   0.4 0.3 0.2 0                       
5   0.5 0.4 0.3 0.1 0                   
A   0.1 0.2 0.3 0.5 0.6 0               
B   0.7 0.8 0.9 1   1.1 0.6 0           
C   1.2 1.3 1.4 1.5 1.6 1.1 0.5 0       
D   1.7 1.8 1.9 2   2.1 1.6 1   0.5 0   
E   2.2 2.3 2.4 2.5 2.6 2.1 1.5 1   0.5 0

I just deducted distance between 2 from 1 from first table to get genetic distance between 1 and 2 (0.2 - 0.1=0.1) and like this I did for rest of the entries and I do not know doing like this is correct or not?, after doing calculation like that made lower triangle matrix. I tried like this in R

x <- read.csv("AD2.csv", head = FALSE, sep = ",")
b<-lower.tri(b, diag = FALSE)

but I am getting only TRUE and FALSE as output not like distance matrix. can any one help to solve this problem and here is link to my example data.

like image 453
user2134713 Avatar asked Jan 30 '18 08:01

user2134713


1 Answers

You can make use of dist to calculate sub-matrices. Then use cbind and create the top and bottom half. Then rbind the 2 halves. Then set upper triangular to NA to create the desired output.

mat <- rbind(
    cbind(as.matrix(dist(tbl[1,])), tbl),
    cbind(tbl, as.matrix(dist(tbl[,1])))
)
mat[upper.tri(mat, diag=FALSE)] <- NA
mat

Hope it helps.

data:

tbl <- as.matrix(read.table(text="1   2   3   4   5
A   0.1 0.2 0.3 0.5 0.6
B   0.7 0.8 0.9 1   1.1
C   1.2 1.3 1.4 1.5 1.6
D   1.7 1.8 1.9 2   2.1
E   2.2 2.3 2.4 2.5 2.6", header=TRUE, check.names=FALSE, row.names=1))
like image 165
chinsoon12 Avatar answered Oct 30 '22 15:10

chinsoon12