Объединить список краев и список узлов (ошибка с вершинами) igraph

У меня есть вопрос об объединении двух файлов csv. Один из них представляет собой edgelist, а другой — nodelist. Я хочу их объединить (graph.data.frame), и это должен быть ориентированный граф. Я использую r версии 3.2.3/rstudio версии 0.99.879 и igraph версия 1.0.1.

Пример этих данных выглядит следующим образом:

libary(igraph)
nodes <- read.csv("data_n.csv", header = TRUE, row.names = 1, sep =";")
links <- read.csv("data_l.csv", header = TRUE, row.names = 1, sep =";")
head(nodes)
  Authors               Institution            status    gender
1 Jan Christoph Suntrup Käte Hamburger Kolleg  Post Doc    M
2 Renate Martinsen      Uni Duisburg-Essen     Prof        F
3 Bernd Ladwig          FU Berlin              Prof        M
4 Kathrin Morgenstern   Uni Regensburg       PhD student   F
5 Barbara Weber         Uni Regensburg         Prof        F

head(links)
From.Author1          To.Author2       relation   text.type 
1 Kathrin Morgenstern   Barbara Weber   undirect   Review  
2 Barbara Weber    Kathrin Morgenstern  undirect   Review
3 Andreas Busen        Paul Sörensen    undirect   other
4 Andreas Busen        Lisa Herzog      direct     other
5 Matthias Lemke    Gregor Wiedemann    undirect   other

Как видите, есть акторы, имеющие взаимную связь, некоторые акторы имеют направленную связь с другим актором, а также есть изолированные узлы.

Объединив список краев и список узлов с graph.data.frame, я получаю следующую ошибку:

g1 <- graph.data.frame(d=links, vertices = nodes, directed = T)
Error in graph.data.frame(links, vertices = nodes, directed = T) : Some
vertex names in edge list are not listed in vertex data frame

Я проверил отсутствующих авторов и теперь почти уверен, что каждый актер из нодлиста указан хотя бы один раз в краевом списке. Я также создал циклы для изолированных авторов в списке краев на случай, если igraph не сможет обработать «NA» в «To.Author2» (позже я буду использовать упрощение до remove.loops). Но эти идеи не устранили ошибку.

Я искал решения и нашел предложение здесь, в котором ответ относится к этому (оба в stackoverflow).

Следуя инструкции, созданный объект графа принимает атрибут ребра, но не включает атрибуты узла.

Итак, как я могу решить эту ошибку, соответственно, что я делаю неправильно?

Ждем ваших предложений и советов!
Любая помощь приветствуется!

EDIT — образец списка узлов и списка краев

dput(head(nodes, 15))
structure(list(no = 1:15, Authors = c("Jan Christoph Suntrup", 
"Renate Martinsen", "Bernd Ladwig", "Kathrin Morgenstern", "Barbara Weber", 
"Claudia Ritter", "Maik Herold", "Eva Marlene Hausteiner", "Andreas Busen", 
"Matthias Lemke", "Cord Schmelzle", "Daniel Jacob", "Oliver Flügel Martinsen", 
"Kari Palonen", "Thomas Schölderle"), Institution = c("Käte Hamburger Kolleg ", 
"Uni Duisburg-Essen", "FU Berlin", "Uni Regensburg", "Uni Regensburg", 
"Uni Kassel", "TU Dresden", "HU Berlin", "Uni Hamburg", "HSU Hamburg", 
"FU Berlin", "FU Berlin", "Uni Bielefeld", "Uni Jyväskylä", "Akademie Tutzing"
), status = c("Post Doc", "Prof", "Prof", "PhD student", "Prof", 
"Post Doc", "PhD student", "PhD student", "PhD student", "Post Doc", 
"Post Doc", "PhD student", "Post Doc", "Prof", "Post Doc"), gender = c("M", 
"F", "M", "F", "F", "F", "M", "F", "M", "M", "M", "M", "M", "M", 
"M")), .Names = c("no", "Authors", "Institution", "status", "gender"
), row.names = c(NA, 15L), class = "data.frame")

dput(head(links, 15))
structure(list(From.Author1 = c("Kathrin Morgenstern", "Barbara Weber", 
"Andreas Busen", "Andreas Busen", "Matthias Lemke", "Matthias Lemke", 
"Cord Schmelzle", "Cord Schmelzle", "Cord Schmelzle", "Cord Schmelzle", 
"Cord Schmelzle", "Cord Schmelzle", "Cord Schmelzle", "Cord Schmelzle", 
"Daniel Jacob"), To.Author2 = c("Barbara Weber", "Kathrin Morgenstern", 
"Paul Sörensen", "Lisa Herzog", "Gregor Wiedemann", "Andreas Niekler", 
"Eva Marlene Hausteiner", "Daniel Jacob", "Thorsten Thiel", "Ulrike Spohn", 
"Christian Volk", "Susanne Schmetkamp", "Maike Weißpflug", "Andreas Oldenbourg", 
"Eva Marlene Hausteiner"), relation = c("undirect", "undirect", 
"undirect", "undirect", "undirect", "undirect", "direct", "direct", 
"direct", "direct", "direct", "direct", "direct", "direct", "direct"
), text.type = c("Review", "Review", "other", "other", "other", 
"other", "Acknowledgement", "Acknowledgement", "Acknowledgement", 
"Acknowledgement", "Acknowledgement", "Acknowledgement", "Acknowledgement", 
"Acknowledgement", "Acknowledgement"), no = 1:15), .Names = c("From.Author1", 
"To.Author2", "relation", "text.type", "no"), row.names = c(NA, 
15L), class = "data.frame")

person Stefan_W    schedule 25.06.2017    source источник
comment
Теперь я почти уверен, что каждый актор из нодлиста хотя бы один раз указан в краевом списке. : ошибка, похоже, обратная, то есть в краевом списке есть узлы, которых нет в списке вершин.   -  person user20650    schedule 26.06.2017
comment
что это возвращает ed = unique(as.character(unlist(links[, c("From.Author1", "To.Author2")]))) ; ve = unique(as.character(nodes$Authors)) ; table(ed %in% ve)   -  person user20650    schedule 26.06.2017
comment
Хорошо, спасибо за совет. В исходной базе данных результат FALSE 5 TRUE 179 -> Это означает, что у меня отсутствуют узлы/авторы в списке краев?   -  person Stefan_W    schedule 26.06.2017
comment
нет, я думаю, это означает, что авторов в краевом списке нет в списке узлов (отсюда и ошибка)   -  person user20650    schedule 26.06.2017
comment
Должно быть тривиально исправить - просто из-за слияния уникальных имен списка краев с именами списка узлов, и это добавит эти имена в список узлов (но без дополнительных атрибутов)   -  person user20650    schedule 26.06.2017
comment
Спасибо за использование dput. Я удаляю свой ответ. Когда я запускаю код из удаленного ответа, мне кажется, что каждый узел в списке краев был добавлен в список узлов. Я не вижу никаких изменений в именах, но получаю сообщение об ошибке, которое вы получили. Мой ответ не решал проблему.   -  person G5W    schedule 26.06.2017
comment
Попробуйте: ed = data.frame(Authors=unique(as.character(unlist(links[, c("From.Author1", "To.Author2")])))) ; nodesNew <- merge(ed, nodes, by="Authors", all=TRUE) g1 <- graph_from_data_frame(d=links, vertices = nodesNew, directed = T)   -  person user20650    schedule 26.06.2017
comment
Отлично. Это сработало. Итак, просто чтобы понять, что вы предложили: с помощью merge вы объединили оба data.frames, а установив all=TRUE, добавились дополнительные строки, верно?! (Однако, когда я сейчас смотрю на набор данных, не появляется ни одной дополнительной строки, которой не было раньше, и количество строк по-прежнему равно 183). Извините за дополнительный вопрос, я просто пытаюсь понять, что произошло, чтобы в следующий раз либо избежать этого, либо решить проблему самостоятельно :)   -  person Stefan_W    schedule 26.06.2017
comment
@Стефан_В ; используя данные dput в вашем вопросе, если я запускаю код из предыдущего комментария я получаю FALSE 10 TRUE 7, и оба набора данных имеют 15 строк. При объединении, установив all=TRUE, будут добавлены дополнительные авторы. Из таблицы комментариев видно, что в списке краев есть 10 авторов, которых нет в списке узлов, поэтому они будут добавлены, в результате чего новый список узлов (после слияния) будет иметь 25 строк.   -  person user20650    schedule 26.06.2017