Длина ребер, метки наконечников и метки узлов в объектах "phylo"
обрабатываются в порядке их появления в таблице кромок.Поэтому вы всегда должны приписывать различные элементы, следя за тем, чтобы они были в правильном порядке, прежде чем их приписать.Например (извините, я не смог воспроизвести ваш пример):
set.seed(1)
## A random tree with 6 edges
test_tree <- rtree(4)
## The edge table
test_tree$edge
# [,1] [,2]
#[1,] 5 1
#[2,] 5 6
#[3,] 6 2
#[4,] 6 7
#[5,] 7 3
#[6,] 7 4
Здесь ребрами являются все элементы, соединяющие узел (цифры >4
) с наконечником (цифры <5
).Вы можете визуализировать их (и их нумерацию), используя plot
:
## Visualising all the elements
plot(test_tree, show.tip.label = FALSE)
edgelabels()
nodelabels()
tiplabels()
Так что теперь, если у вас есть такой кадр данных:
## A random data frame
df <- as.data.frame(rnorm(6))
names(df) <- "length"
## The edges in the "wrong" order
row.names(df) <- sample(1:6)
Вы можете правильно приписать строки, используя:
## Get the order of the edges
test_tree$edge.length <- df$length[sort(rownames(df))]
В этом случае сортировка довольно проста, поскольку имена ребер в df
являются числовыми, но логика такова, что первый элемент в test_tree$edge.length
должен быть длиной соединительного узла ребра 5к подсказке 1 и т. д. ...
Опять же, поскольку ваш пример не воспроизводим, трудно понять, что не так, но я бы сказал, что ваша df$length
не правильная длина.