使用R中的系统发育树,我想要创建一个矩阵,它指示每个树的分支(B1到B8)是否与每个物种(A到E)相关联,其中1s表示分支是相关联的。(见下文)
R函数which.edge()对于识别物种的终端分支非常有用。但它并不能识别与每个物种相关的所有分支。我能用什么功能来识别每一个物种从树根到顶端的所有树枝?
示例树
library(ape)
ex.tree <- read.tree(text="(A:4,((B:1,C:1):2,(D:2,E:2):1):1);")
plot(ex.tree)
edgelabels() #shows branches 1-8这是我想要创建的矩阵(物种A作为列,分支B1-B8作为行),但是有一个简单的函数而不是手工。
B1 <- c(1,0,0,0,0)
B2 <- c(0,1,1,1,1)
B3 <- c(0,1,1,0,0)
B4 <- c(0,1,0,0,0)
B5 <- c(0,0,1,0,0)
B6 <- c(0,0,0,1,1)
B7 <- c(0,0,0,1,0)
B8 <- c(0,0,0,0,1)
Mat <- rbind(B1,B2,B3,B4,B5,B6,B7,B8)
colnames(Mat) <- c("A","B","C","D","E")
Mat例如,分支B2属于物种B-E,而不属于物种A.对于物种E,存在分支B2、B6、B8 .
哪一个R函数最好?提前感谢!
发布于 2015-11-09 23:42:40
我不知道有任何内置的功能可以做到这一点。我编写了一个助手函数,它可以从存储在tree对象中的边缘数据计算这一点。
branchNodeAdjacency <- function(x) {
m <- matrix(0, ncol=nt, nrow=nrow(x$edge))
from <- x$edge[,1]
to <- x$edge[,2]
g <- seq_along(x$tip.label)
while (any(!is.na(g))) {
i <- match(g, to)
m[cbind(i, seq_along(i))] <- 1
g <- from[i]
}
rownames(m) <- paste0("B", seq.int(nrow(m)))
colnames(m) <- x$tip.label
m
}
branchNodeAdjacency(ex.tree)
# A B C D E
# B1 1 0 0 0 0
# B2 0 1 1 1 1
# B3 0 1 1 0 0
# B4 0 1 0 0 0
# B5 0 0 1 0 0
# B6 0 0 0 1 1
# B7 0 0 0 1 0
# B8 0 0 0 0 1我们的思想是跟踪哪个叶节点的值由每个内部节点表示。
https://stackoverflow.com/questions/33618821
复制相似问题