Манипулирование списком ребер в сетевом графике в R

#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 ... ...