Добавить атрибут ребра к параллельным ребрам в igraph - PullRequest
0 голосов
/ 24 мая 2018

У меня есть график с некоторыми параллельными ребрами, как показано на приведенной ниже матрице смежности:

> as_adjacency_matrix(g)
45 x 45 sparse Matrix of class "dgCMatrix"
   [[ suppressing 45 column names ‘1’, ‘2’, ‘3’ ... ]]
   [[ suppressing 45 column names ‘1’, ‘2’, ‘3’ ... ]]

1  . . . 1 . . . . . . . . . . . . . . 1 1 2 1 2 1 1 . . . . . . . . . . . . . . . . . . . .
2  . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 2 . . . . . . . . . . . . . . . . .
3  . . . 1 . . . . . . . . . . . . . . . . . . 1 . 1 . 2 . . . . . . . . . . . . . . . . . .
4  1 . 1 . . . . . . . . . . . 2 . . . . . . . . . . . . . 1 1 . . . . . . . . . . . . . . .
5  . . . . . . . . . . . . . . 2 . . . . . . . 1 . . . . . . 1 . . . . . . . . . . . . . . .
6  . . . . . . . . . . . . . . . . . . . . . 1 . . . . . . . . 1 . . . . . . . . . . . . . .
7  . . . . . . . . . . . . . . . . . . . . . . . . . 1 . . . . . 1 1 . 1 1 . . . . . . . . .
8  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . 1 . . . . . . . . .
9  . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . . 1 . . . . . 1 1 . . . . . . .
10 . . . . . . . . . . . . . . . . . . . . . . . . . 2 . . . . . . . . . 2 . . . . . . . . .
11 . . . . . . . . . . . . . . . . . . . . . . 1 . . . . 1 . . . . . . . . . . . . . . . . .

Мне нужно добавить атрибуты к ребрам.К счастью, параллельные ребра между узлами будут иметь идентичные атрибуты.Атрибуты, которые нужно добавить, находятся в матрице того же измерения, что и матрица смежности:

> edge_attr_mat
           1        2        3          4        5        6         7        8        9        10       11       12
1       0.00      0.0      0.0  68299.332      0.0     0.00     0.000    0.000     0.00     0.000     0.00     0.00
2       0.00      0.0      0.0      0.000      0.0     0.00     0.000    0.000     0.00     0.000     0.00     0.00
3       0.00      0.0      0.0 102016.916      0.0     0.00     0.000    0.000     0.00     0.000     0.00     0.00
4   68299.33      0.0 102016.9      0.000      0.0     0.00     0.000    0.000     0.00     0.000     0.00     0.00
5       0.00      0.0      0.0      0.000      0.0     0.00     0.000    0.000     0.00     0.000     0.00     0.00
6       0.00      0.0      0.0      0.000      0.0     0.00     0.000    0.000     0.00     0.000     0.00     0.00
7       0.00      0.0      0.0      0.000      0.0     0.00     0.000    0.000     0.00     0.000     0.00     0.00
8       0.00      0.0      0.0      0.000      0.0     0.00     0.000    0.000     0.00     0.000     0.00     0.00
9       0.00      0.0      0.0      0.000      0.0     0.00     0.000    0.000     0.00     0.000     0.00     0.00
10      0.00      0.0      0.0      0.000      0.0     0.00     0.000    0.000     0.00     0.000     0.00     0.00
11      0.00      0.0      0.0      0.000      0.0     0.00     0.000    0.000     0.00     0.000     0.00     0.00
12      0.00      0.0      0.0      0.000      0.0     0.00     0.000    0.000     0.00     0.000     0.00     0.00
13      0.00      0.0      0.0      0.000      0.0     0.00     0.000    0.000     0.00     0.000     0.00     0.00
14      0.00      0.0      0.0      0.000      0.0     0.00     0.000    0.000     0.00     0.000     0.00     0.00
15      0.00      0.0      0.0 380794.817 154931.3     0.00     0.000    0.000     0.00     0.000     0.00     0.00
16      0.00      0.0      0.0      0.000      0.0     0.00     0.000    0.000     0.00     0.000     0.00     0.00
17      0.00      0.0      0.0      0.000      0.0     0.00     0.000    0.000     0.00     0.000     0.00     0.00
18      0.00      0.0      0.0      0.000      0.0     0.00     0.000    0.000     0.00     0.000     0.00     0.00
....

Я пытался использовать эту матрицу в качестве взвешенной матрицы смежности, чтобы воссоздать сеть так, чтобы теперь присутствовали атрибуты ребер.:

g<-graph_from_adjacency_matrix(edge_attr_mat, mode=c("undirected"), diag = F, weighted = T)

Однако я теряю параллельные ребра, поскольку они сворачиваются в одно ребро между узлами.

Есть ли способ добавить атрибуты к ребрам (и параллельнограни) используя функцию или матричную операцию без циклического прохождения каждой записи?

ОБНОВЛЕНИЕ

Небольшой репрезентативный набор данных, чтобы помочь с ответом:

g <- make_empty_graph(n = 4) %>%
+     add_edges(c(1,2, 2,4, 3,4, 1,3, 1,4)) %>%
+     set_edge_attr("type", value = "friend") %>%
+     add_edges(c(1,3, 2,4), type = "col")
g <- as.undirected(g, mode = "each")
V(g)$name <-c ("A", "B", "C", "D")
edge_attr_mat<-matrix(data=c(0,1.1,2.12,1.2,1.1,0,0,2.3,2.12,0,0,1.6,1.2,2.3,1.6,0), nrow = 4) #This is the new edge attribute to be added

В приведенном выше примере атрибут ребра type различает 2 параллельных ребра.Новые атрибуты ребер являются мерой сходства между двумя узлами и поэтому должны быть одинаковыми для всех параллельных ребер между двумя узлами.

1 Ответ

0 голосов
/ 24 мая 2018

Так что %u%, похоже, не работает, потому что объединяет только первое сопоставленное ребро и не меняет никаких атрибутов второго совмещенного ребра.Я думаю, что самый простой подход - преобразовать графики в фрейм данных и объединить их вместе:

g2 <- graph_from_adjacency_matrix(edge_attr_mat, 'undirected', weighted = T)
V(g2)$name <-c ("A", "B", "C", "D")

gdf <- as_data_frame(g)
g2df <- as_data_frame(g2)

#dplyr also has function as_data_frame
gdf %>%
  dplyr::left_join(g2df) %>%
  graph_from_data_frame(F)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...