У меня есть вопрос об объединении двух файлов 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")
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.2017FALSE 5 TRUE 179
-> Это означает, что у меня отсутствуют узлы/авторы в списке краев? - person Stefan_W   schedule 26.06.2017ed = 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.2017merge
вы объединили оба data.frames, а установивall=TRUE
, добавились дополнительные строки, верно?! (Однако, когда я сейчас смотрю на набор данных, не появляется ни одной дополнительной строки, которой не было раньше, и количество строк по-прежнему равно 183). Извините за дополнительный вопрос, я просто пытаюсь понять, что произошло, чтобы в следующий раз либо избежать этого, либо решить проблему самостоятельно :) - person Stefan_W   schedule 26.06.2017FALSE 10 TRUE 7
, и оба набора данных имеют 15 строк. При объединении, установив all=TRUE, будут добавлены дополнительные авторы. Из таблицы комментариев видно, что в списке краев есть 10 авторов, которых нет в списке узлов, поэтому они будут добавлены, в результате чего новый список узлов (после слияния) будет иметь 25 строк. - person user20650   schedule 26.06.2017