2014-09-10 4 views
1

Я нов к R и у меня есть объект графа, который я создал из объекта фрейма данных «allTog», как показано ниже:R: Как пройти от корневого узла к каждому листовому узлу в объекте данных iGraph и получить путь?

library(igraph) 
df.g <- graph.data.frame(d = allTog, directed = TRUE) 
plot(df.g, vertex.label = V(df.g)$name) 

enter image description here

Кадр данных allTog задается

allTog <- data.frame(
    source = c("chamber", "chamber", "chamber", "chamber", "chamber", 
    "check", "check", "issue", "issue", "issue"), 
    target = c("check", "issue", "leak", "process", "found", "power", 
    "customer", "customer", "wafer", "replaced") 
    ) 

Столбцы «row.names» и «values» здесь не представляют интереса.

Как я могу переходить от каждого корневого узла, в данном случае к «камере», к каждому листовому узлу и получить путь к всем именам узлов (вершин)? Я ищу универсальное решение, потому что мой корневой узел может меняться при каждом запуске кода. Например, в следующем запуске корневой узел может быть «проблемным».

Мой вывод, который я хочу это:

chamber->check->power 
chamber->issue->replaced 
chamber->process 
chamber->issue->customer 

Так и так далее ....

+0

Очень неясно, какой результат вы хотите. Вам действительно нужна трансверсаль? Не похоже, что вы говорите по узлам, собирающим любую информацию. Кроме того, как вы определяете корневой узел в каждом кластере? Является ли узел только входящими ссылками? Будет ли всегда один из них? Я просто хочу убедиться, что полностью понимаю ваши тестовые данные. Потому что вы просите пути от каждого листа к каждому корню, но сейчас все это ровно одно ребро. – MrFlick

+0

Корневой узел определяется выпадающим меню пользователя в пользовательском интерфейсе Rshiny. Вот почему корневой узел может измениться. Всегда будет только один корневой узел. Например: в другом прогоне корневой узел может быть «вафельным». Я тоже отредактировал вопрос, возможно, это вызовет больше света. – user1452759

ответ

4

Как насчет

root <- "chamber" 
leafnodes <- sapply(V(df.g), function(x) length(neighbors(df.g,x))==0) 
paths <- get.all.shortest.paths(df.g, V(df.g)[root], leafnodes)$res 
sapply(paths, function(vs) paste(V(df.g)[vs]$name, collapse="->")) 

В этом списке перечислены все узлы листа вы можете получить до

# [1] "chamber->leak"   "chamber->process"   "chamber->found"   
# [4] "chamber->check->power" "chamber->issue->customer" "chamber->check->customer" 
# [7] "chamber->issue->wafer" "chamber->issue->replaced" 
+0

хорошая точка @thelatemail Я думаю, я пропустил только часть от корня до листа. Будет обновляться. – MrFlick

+0

Эй, спасибо за эту идею. Я вижу, что в этом сюжете есть 8 путей. Но get.shortest.paths возвращает только 7 путей. «камера-> проблема-> клиент» отсутствует. Есть все равно, чтобы получить все 8 путей? – user1452759

+0

Я принимаю этот ответ, поскольку я решил работать с этим, казалось бы, частичным выходом. Спасибо вам всю помощь! – user1452759