#r #network-analysis
Вопрос:
У меня есть edgelist
приложение, в котором есть следующие столбцы, from
и to
. Это представляет собой ребра между узлами.
from = c("10009", "10009", "10009", "10009", "10011", "10011", ...) to = c("23908", "230908", "230908", "230908", "230514", "230514", ...) edgelist = data.frame(from, to) nodes = c("10009", "10011", "230908", "230514" ...)
Затем я создал сетевой объект, преобразованный в объект графика, чтобы рассчитать его показатели центральности:
library(network) library(qgraph) library(igraph) network_el = network(edgelist, vertex.attr = nodes, directed=T) #network object g = asIgraph(network_el) #convert to graph object centrality = centrality_auto(g) #calculate Centrality df = data.frame(centrality$edge.betweenness.centrality) #extract edge betweenness centrality into a dataframe
Это дает мне фрейм данных со столбцами c(«от», «до», «центральность»). Однако «от» и «до» больше не являются исходными именами узлов, перечисленными в edgelist
. Они были преобразованы в другой идентификатор, начиная с 1…to последний ряд.
#my current results from = c("1","2","3","4"...) to = c("6", "100", "204", ...) edge.betweenness.centrality = c(4653193, 20188105, ...)
Как мне объединить исходные имена узлов? Мне нужно определить фактические «от» и «до» (т. Е. данные узла), такие как:
#my desired results from = c("10009", "10009", "10009", "10009", "10011"...) #rather than 1,2,3.. to = c("23908", "230908", "230908", "230908", "235014",...) edge.betweenness.centrality = c(4653193, 20188105, ...)
Комментарии:
1. Легче помочь, если мы знаем, как выглядит структура, без необходимости создавать набор данных для себя. Пожалуйста, укажите минимальный воспроизводимый пример, включая
library
звонки и описание ожидаемого результата2. Спасибо за вашу помощь, отредактировал мой вопрос, чтобы сделать его более понятным.
Ответ №1:
Я думаю, что это работает — идентификаторы узлов теперь вернулись на свои места!
#Assign as dictionary dict lt;- data.frame(name = V(g)$vertex.names) dict lt;- data.frame (row.names(dict), dict) #Replace with dictionary values df$from lt;- with(dict, name[match(df$from, row.names.dict.)]) df$to lt;- with(dict, name[match(df$to, row.names.dict.)])
Ответ №2:
Вот пример использования igraph:
library(igraph)
Мы создаем пример графа с явными именами вершин:
g lt;- sample_pa(length(letters), m=2, directed=F) V(g)$name lt;- letters
Вычислите разницу между ребрами и сохраните ее в атрибуте ребра:
E(g)$eb lt;- edge_betweenness(g)
Теперь кадр данных, который вы просили, с исходными именами вершин:
gt; as_data_frame(g) from to eb 1 a b 12.831818 2 a c 16.524242 3 b c 25.700000 4 c d 30.812879 5 b d 12.464394 ... ...