Установка edge.lenth в phylo-объекте с использованием переменной в data.frame

Я хочу установить «edge.length» в объекте phylo, используя переменную в data.frame. «Node.label» «tip.label» в phylo-объекте соответствует именам строк в data.frame. Как можно установить edge.length с помощью переменной в data.frame, обеспечивая при этом правильное сопоставление данных? В приведенном ниже коде он находится на шаге 3. Я хочу, чтобы длина edge.length соответствовала так, чтобы node.label или tip.label совпадали с row.name в data.frame.

## R code:
## load ape
library(ape)
## 1. A phylo object:
library(data.tree)

A1  <- Node$new("A1")
B1  <- A1$AddChild("B1")
C1  <- B1$AddChild("C1")
D1  <- C1$AddChild("D1")
E1 <- C1$AddChild("E1")
F1 <- E1$AddChild("F1")
G1 <- E1$AddChild("G1")
H1 <- G1$AddChild("H1")
A1.phylo <- as.phylo.Node(A1)


## 2. A data.frame:
set.seed(1)
df <- as.data.frame(rnorm(7, 5, 3))
names(df) <- "length"
row.names(df) <- c("B1","C1","D1","E1","F1","G1","H1")

## 3. Ad the data to A1.phylo$edge.length
A1.phylo$edge.length <- df$length ## wrong!!!

person Erling Lundevaller    schedule 26.11.2018    source источник
comment
Добро пожаловать в SO! Пожалуйста, добавьте свои данные и код, который вы пробовали.   -  person Ben G    schedule 26.11.2018


Ответы (1)


Длины кромок, метки кончиков и метки узлов в объектах "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 не правильной длины.

person Thomas Guillerme    schedule 27.11.2018
comment
Спасибо, Томас. Я добавил библиотеку (data.tree), которая должна сделать ее воспроизводимой. Сценарий, о котором я думаю, заключается в том, что вы не знаете порядок. И вы хотите установить edge.length, связанный с подсказкой H1, равным значению строки H1 в data.frame и так далее. - person Erling Lundevaller; 27.11.2018
comment
Спасибо, Эрлинг, теперь твой пример действительно работает! Вы можете проверить ответ, который я дал на этот вопрос, чтобы преобразовать граничную таблицу в более интерпретируемые данные (например, какое ребро ссылается на какой узел). Затем вы можете решить, в каком порядке вы хотите, чтобы ваш df$length был передан в tree$edge.length, используя ту же логику, что я описал в этом ответе. Надеюсь, это имеет смысл. - person Thomas Guillerme; 27.11.2018