Следуя предложению в комментарии пользователя 20650 здесь , вы можете определить, как обернуть расстояния до объекта dist
, используя функцию lower.tri
. Однако приведенный пример не будет работать, поскольку он не обеспечивает попарные расстояния между выборками. Таким образом, решение берет ваши имена выборок, генерирует случайные данные и затем строит дерево с помощью функции nj
из пакета ape
.
# get all sample names
x.names = unique(c(levels(x[, 1]), levels(x[, 2])))
n = length(x.names)
# create all combinations for samples for pairwise comparisons
x2 = data.frame(t(combn(x.names, m = 2)))
# generate random distances
set.seed(4653)
x2$distance = sample(seq(from = 0.1, to = 1, by = 0.05), size = nrow(x2), replace = TRUE)
# prepare a matrix for pairwise distances
dst = matrix(NA, ncol = n, nrow = n, dimnames = list(x.names, x.names))
# fill the lower triangle with the distances obtained elsewhere
dst[lower.tri(dst)] = x2$distance
# construct a phylogenetic tree with the neighbour-joining method
library(ape)
tr = nj(dst)
plot(tr)
Формат дерева newick можно сохранить с помощью функции ape::write.tree
или вывести на консоль как:
cat(write.tree(tr))
# (BGC53:0.196875,BGC45:0.153125,(((BGC35:0.025,BGC51:0.275):0.1583333333,BGC31:0.2416666667):0.240625,BGC34:0.246875):0.003125);