R语言 执行成对计算并以矩阵形式输出结果

but5z9lq  于 2023-01-03  发布在  其他
关注(0)|答案(1)|浏览(162)

考虑以下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
5jdjgkvh

5jdjgkvh1#

也许我们可以在这里使用outer并转换为dist

out <- outer(seq_len(nrow(matrix_)), seq_len(nrow(matrix_)), 
     Vectorize(function(i, j) phylo_dist(matrix_[c(i, j),], tree_)))
dimnames(out) <- list(row.names(matrix_), row.names(matrix_))
  • 输出
> as.dist(out)
         site_1   site_2
site_2 1.276455         
site_3 2.191359 3.045831

相关问题