Я пишу R-программу для анализа древовидной структуры.В моем примере ниже, в дереве есть 10 узлов, и предки каждого узла (родительские узлы этого узла, а также родительские узлы этого узла и т. Д.) Хранятся в списке, называемом предками.Пользователь запросит вектор имен узлов, и я пытаюсь создать список, который будет заполнен предками этого запроса.Каждый элемент в списке будет содержать список потомков запроса для каждого из вызванных предков.Пожалуйста, смотрите ниже пример
Допустим, у меня есть следующая структура.
Так что список предков будет выглядеть так
Ancestors <- list()
Ancestors$'p1' <- c('p2', 'p3', 'p4', 'p5', 'p8', 'p9', 'p10')
Ancestors$'p2' <- c('p4', 'p5', 'p8', 'p9', 'p10')
Ancestors$'p3' <- c('p4', 'p5', 'p9', 'p10')
Ancestors$'p4' <- c('p5', 'p9', 'p10')
Ancestors$'p5' <- c('p9', 'p10')
Ancestors$'p6' <- c('p4', 'p5', 'p9', 'p10')
Ancestors$'p7' <- c('p5', 'p9', 'p10')
Ancestors$'p8' <- c('p5', 'p9', 'p10')
Ancestors$'p9' <- NA
Ancestors$'p10' <- NA
Скажем, запрос:
query <- c('p5', 'p4', 'p1')
Тогда список, который я хотел бы составить, будет
# lst <- list()
#
# lst$'p2'
# 'p1'
# lst$'p3'
# 'p1'
# lst$'p4'
# 'p1'
# lst$'p5'
# 'p1', 'p4'
# lst$'p8'
# 'p1'
# lst$'p9'
# 'p1', 'p4', 'p5'
# lst$'p10'
# 'p1', 'p4', 'p5'
(2,3,4,5,8,9,10) все предки, которые существуют для условий запроса.Вот список, который я хотел бы составить.Затем для каждого из названных элементов я хотел бы записать список условий запроса, которые являются потомками элемента списка.Я извиняюсь за запутанный пример.Надеюсь, это имеет смысл.
Вот что я попробовал до сих пор
lst <- list()
lapply(query, function(x) {
theAncestors <- Ancestors[[x]]
sapply(theAncestors, function(y) {
lst[[y]][[1]] <- c(lst[[y]][[1]], x)
})
})
Но этот список не заполняется.Все, что происходит, это то, что он печатает
[[1]]
p9 p10
"p5" "p5"
[[2]]
p5 p9 p10
"p4" "p4" "p4"
[[3]]
p2 p3 p4 p5 p8 p9 p10
"p1" "p1" "p1" "p1" "p1" "p1" "p1"
, что немного отличается от того, что я хочу.Кроме того, когда я пытаюсь вывести lst, он все еще пуст.Так что этот код даже не влияет на lst.Итак, как я могу получить желаемый результат?Я думал об использовании цикла for, но я думаю, что они очень медленные в R. Моя настоящая проблема, вероятно, будет состоять из сотен или тысяч терминов запроса и еще многих терминов-предков.Так что это будет очень долго.Поэтому я думаю, что цикл for, вероятно, не сработает.
Редактировать: Я понял это.Мой код теперь:
lst <- list()
aLst <- unlist(lapply(query, function(x) {
theAncestors <- Ancestors[[x]]
sapply(theAncestors, function(y) {
lst[[y]][1] <- c(lst[[y]][[1]], x)
})
}))
aLst <- split(unname(aLst), names(aLst))
Это распечатывает
$p10
[1] "p5" "p4" "p1"
$p2
[1] "p1"
$p3
[1] "p1"
$p4
[1] "p1"
$p5
[1] "p4" "p1"
$p8
[1] "p1"
$p9
[1] "p5" "p4" "p1"
Что я и хотел