У меня есть тысяча филогенетических деревьев, чтобы обрезать их так:
- Удалите все повторяющиеся последовательности, кроме одной (например: SP1-SP2 дублированы, а SP13-SP14 также используют пороговое значение 0,0001. Я бы хотел, чтобы один вид в каждой паре хранился случайным образом). Допустим, я сохранил SP1 и SP14.
- Удалить ветви нулевой длины (SP10, SP7, SP3 и SP14 с порогом 0,0001). Проблема здесь: Я не могу удалить короткую ветвь, ведущую к SP1, поэтому SP1 также удаляется на этом этапе, несмотря на то, что я хотел бы удалить только короткую ветвь, ведущую к SP1, и трансплантат SP1 в качестве кончика выделенная ветвь.
Я написал следующий код в R:
tree <- read.tree(file='MyTree.tre')
tips <- tree$tip.label
nodes<-sapply(tips,function(x,y) which(y==x),y=tree$tip.label)
edge.lengths<-setNames(tree$edge.length[sapply(nodes,function(x,y) which(y==x),y=tree$edge[,2])],names(nodes))
e <- data.frame(edge.lengths)
E <- as.data.frame(add_rownames(e, var = 'taxa'))
ByeBye <- E[E$edge.lengths<0.0001,1]
tr.p <- drop.tip(tree, ByeBye)
Вот мое дерево ввода:
(SP1:0.00000001,SP2:0.00000001,(SP3:0.00000065,((SP4:0.02355024,(SP5:0.07343248,SP6:0.07280366)22:0.00000033)50:0.02354874,(SP7:0.00000059,(SP8:0.07323173,((SP9:0.04761974,SP10:0.00000072)59:0.04865423,((SP11:0.02604142,SP12:0.19513180)53:0.02235647,(SP13:0.00000033,SP14:0.00000001)25:0.00000001)54:0.02452009)31:0.02362920)8:0.00000078)43:0.04811732)12:0.00000033)93:0.07279201);