考虑以下3个地点的几个分类群的系统发生树和存在-不存在数据矩阵:
set.seed(020123)
tree_ <- phytools::pbtree(b = 1, n = 7)
matrix_ <- structure(
c(1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0,
0, 0, 0, 1, 0, 0, 1, 0, 0, 1),
dim = c(3L, 7L),
dimnames = list(c("site_1", "site_2", "site_3"),
c("t1", "t2", "t3", "t4", "t5", "t6", "t7"))
)
我想计算所有站点的成对系统发育距离,并将结果存储在类dist
的对象中。
我可以使用以下函数计算两个站点之间的系统发育距离:
get_community_taxa <- function(x) {
list(
colnames(x)[x[1, ] == 1L],
colnames(x)[x[2, ] == 1L]
)
}
phylo_dist <- function(x, tree) {
distance_mtx <- ape::cophenetic.phylo(tree)
communities <- get_community_taxa(x)
phylo_dist <- distance_mtx[
communities[[1]],
communities[[2]]
]
if (length(phylo_dist) == 1L) {
return(phylo_dist)
}
mean(c(
apply(phylo_dist, 1, function(x) min(x, na.rm = TRUE)),
apply(phylo_dist, 2, function(x) min(x, na.rm = TRUE))
))
}
我试着将上面的函数与combn
结合使用,combn
给出了每对站点的距离向量:
apply(
combn(nrow(v), 2),
MARGIN = 2,
function(x) phylo_dist(matrix_[x, ], tree_)
)
#> [1] 1.276455 2.191359 3.045831
但是我不确定如何在结构良好的矩阵中输出这些值(见下文)。
下面是所需的输出(dist
类的对象):
site_1 site_2
site_2 1.276455
site_3 2.191359 3.045831
1条答案
按热度按时间5jdjgkvh1#
也许我们可以在这里使用
outer
并转换为dist