цикл для извлечения и / или манипулирования филогенией в R по множественным значениям другой переменной - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть набор данных, в котором есть несколько видов, перечисленных для каждого значения другого столбца (назовите его индексным столбцом) в R. Мне нужно извлечь или сократить филогению (из филоматического) для каждого значения столбца, а затем рассчитатьфилогенетическое расстояние для каждого значения столбца индекса. В моем наборе данных много значений индекса, поэтому нецелесообразно делать это вручную.

Пример входных данных (2 столбца, один для индекса и один для вида):

Index      Species
A ;         Sp. 1
A ;         Sp. 2
A ;         Sp. 3
A ;         Sp. 4
B ;         Sp. 5
B ;         Sp. 1
C ;         Sp. 6
D ;         Sp. 7
D ;         Sp. 2
D ;         Sp. 8
D ;         Sp. 9

ЧтоЯ хочу получить выходные данные (значения составлены; каждый индекс появляется один раз и рассчитывается филогенетическое расстояние всех связанных с ним видов):

Index;      phylogentic distance
A ;         7
B ;         3
C ;         1
D ;         5

Я загрузил глобальное дерево (для всех видов в наборе данных) изфиломатический, используя разветвленный пакет. Я мог бы либо создать цикл или функцию, чтобы обрезать филогению для видов в каждой категории индекса и вычислить PD, либо я мог бы создать функцию для извлечения нового дерева из филоматики для каждого значения индекса, а затем для вычисления PD. Я был бы очень признателен, если бы кто-нибудь сделал что-то подобное или есть идеи о том, как реализовать это в R. Очень благодарен заранее!

library(brranching)

phylomatic(data$Species)

1 Ответ

0 голосов
/ 11 ноября 2019

Я разобрался. Сначала я преобразовал столбец индекса в числовой, а затем запустил следующий цикл. Функция drop.tip () из пакета ape.

IDs <- unique(d.test$index.num)

dd <- data.frame(matrix(nrow=length(IDs), ncol=2))

for (i in 1:length(IDs)) {
temp <- subset(d.test, d.test$index.num == i)
species <- as.vector(temp$Species)
species <- tolower(species)
pruned.tree <- drop.tip(tree, setdiff(tree$tip.label, species))
pd <- sum(pruned.tree$edge.length)
dd[i,1] <-i
dd[i,2] <- pd
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...