使用data.frame中的变量在phylo对象中设置edge.lenth

使用data.frame中的变量在phylo对象中设置edge.lenth,r,phylogeny,ape-phylo,R,Phylogeny,Ape Phylo,我想使用data.frame中的变量设置phylo对象中的“edge.length”。phylo对象中的“node.label”“tip.label”对应于data.frame中的行名。如何使用data.frame中的变量设置edge.length,同时确保数据正确匹配?在下面的代码中,它位于步骤3。我希望匹配edge.length,以便node.label或tip.label与data.frame中的row.name匹配 ## R code: ## load ape library(ape)

我想使用data.frame中的变量设置phylo对象中的“edge.length”。phylo对象中的“node.label”“tip.label”对应于data.frame中的行名。如何使用data.frame中的变量设置edge.length,同时确保数据正确匹配?在下面的代码中,它位于步骤3。我希望匹配edge.length,以便node.label或tip.label与data.frame中的row.name匹配

## 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!!!
##R代码:
##负载猿
图书馆(ape)
## 1. phylo对象:
库(data.tree)

A1对象中的边长度、尖端标签和节点标签按照它们在边表中出现的顺序处理。因此,您应该始终对不同的元素进行属性化,同时确保它们在属性化之前的顺序正确。例如(很抱歉,我无法复制您的示例):

现在,如果您有这样一个数据帧:

## 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)
##随机数据帧

df在
“phylo”
对象中,边长度、尖端标签和节点标签按照它们在边表中出现的顺序处理。因此,您应该始终对不同的元素进行属性化,同时确保它们在属性化之前的顺序正确。例如(很抱歉,我无法复制您的示例):

现在,如果您有这样一个数据帧:

## 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)
##随机数据帧

df欢迎来到SO!请添加您的数据和您尝试过的代码。欢迎使用SO!请添加您的数据和您尝试过的代码。谢谢Thomas。我添加了“library(data.tree)”,这将使它具有可复制性。我想的情况是你不知道顺序。您需要将与tip“H1”关联的edge.length设置为data.frame中行“H1”的值,依此类推。感谢Erling,您的示例现在确实有效!您可以检查我给出的答案,以便将边表转换为更可解释的数据(即,哪些边链接到哪个节点)。然后,您可以使用与我在本回答中所述相同的逻辑来决定将
df$length
传递到
tree$edge.length
的顺序。我希望这有道理。谢谢托马斯。我添加了“library(data.tree)”,这将使它具有可复制性。我想的情况是你不知道顺序。您需要将与tip“H1”关联的edge.length设置为data.frame中行“H1”的值,依此类推。感谢Erling,您的示例现在确实有效!您可以检查我给出的答案,以便将边表转换为更可解释的数据(即,哪些边链接到哪个节点)。然后,您可以使用与我在本回答中所述相同的逻辑来决定将
df$length
传递到
tree$edge.length
的顺序。我希望这是有道理的。
## 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))]