将边属性添加到igraph中的平行边

将边属性添加到igraph中的平行边,r,matrix,igraph,R,Matrix,Igraph,我有一个带有平行边的图,如下面的邻接矩阵所示: > 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

我有一个带有平行边的图,如下面的邻接矩阵所示:

> 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%
+设置边属性(“type”,value=“friend”)%>%
+添加边(c(1,3,2,4),type=“col”)

g因此
%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)

g2我认为问题源于您正在创建一个无向图。根据惯例,无向边是“平行”的,因为您可以在两个方向上遍历该边。事实上,若你们调整矩阵是不对称的,那个么你们可能应该按照指示来处理它。@emilliman5:好的观点。矩阵是对称的。因此,即使我这样做,边也会折叠成一条边。此外,我的网络中的边只能作为无向边来理解。如果你的矩阵是对称的,那么你就不需要“看到”图中的两条边,因为它们隐含为无向边。@Emiliman 5:我需要看到多条边,因为它们代表两个节点之间的两种连接类型。我需要为这些平行边附加相同的附加边属性。请生成一个小的代表性数据集,以便我们更好地了解您的问题。如果平行边的属性相同,我很难理解为什么需要显示平行边。
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)