0

这应该相对简单,但由于某种原因,我被难住了。

我想重新排序系统发育距离矩阵,以便列按字母顺序排列。

这是一个简单的例子:

require("ape")
set.seed(5)
dist(cophenetic(rtree(5)))

有任何想法吗?

4

2 回答 2

1

像这样?

require("ape")
set.seed(5)
res <- dist(cophenetic(rtree(5)))
res <- as.matrix(res)
res <- as.dist(res[order(rownames(res)),order(colnames(res))])
于 2012-11-12T19:39:30.043 回答
1

如果T <- dist(cophenetic(rtree(5)))

T 属于类dist,因此它没有名称,只有标签。
您可以订购它的标签

ordering <- sort(attr(T, "Labels"))

您可以将其强制转换为矩阵,然后对其进行排序

T.mat <- as.matrix(T)[ordering, ordering]

然后正如@Roland 建议的那样,将其转换回dist

T  <- as.dist(T.mat)

如果您想控制矩阵的格式,可以使用以下

T.fm <- format(T.mat, digits=3, nsmall=3)
T.fm[row(T.fm) < col(T.fm)] <- ""
print(T.fm, quote=F)

#      t1    t2    t3    t4    t5   
# t1 0.000                        
# t2 3.436 0.000                  
# t3 1.309 3.632 0.000            
# t4 2.145 2.338 2.530 0.000      
# t5 1.756 2.783 2.173 1.136 0.000

T  <- as.dist(T.fm)
T
#       t1    t2    t3    t4
# t2 3.436                  
# t3 1.309 3.632            
# t4 2.145 2.338 2.530      
# t5 1.756 2.783 2.173 1.136
于 2012-11-12T19:50:26.310 回答