创建下三角遗传距离矩阵。

5
我有一个距离矩阵,就像这样:
      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

现在我想创建像这样的下三角矩阵
    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

我只是从第一个表格中减去2和1之间的距离,以得到1和2之间的遗传距离(0.2-0.1=0.1),并且像这样为其余的条目做了同样的计算。我不知道这样做是否正确?在进行这种计算后,我制作了下三角矩阵。我在R中尝试了这样的计算。

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

但是我的输出只有TRUE和FALSE,而不像距离矩阵那样。有谁能帮忙解决这个问题?这是我示例数据的链接。
1个回答

4
你可以使用 dist 函数来计算子矩阵,然后使用 cbind 创建上下两半部分,再将它们使用 rbind 合并。最后将上三角设置为 NA 即可得到期望的输出结果。
mat <- rbind(
    cbind(as.matrix(dist(tbl[1,])), tbl),
    cbind(tbl, as.matrix(dist(tbl[,1])))
)
mat[upper.tri(mat, diag=FALSE)] <- NA
mat

希望这能帮到您。
数据:
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))

亲爱的Chinsoon,非常感谢您的帮助,它完美地运行了,但我不确定我是否正确地进行了距离计算,例如1和2之间的距离,1和3之间的距离,2和3之间的距离等等。您的解决方案完美地运行。 - user2134713

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接