2017-09-25 38 views
1

我创建了一个表igraph用的igraph边缘向前和向后信息列表中的数据如下:如何创建表与

enter image description here

,其中A,B,C,d,e为边缘。 a和b是互惠边缘, ,a-> b的权值为1,b-> a(没有自环)的权重值为2。


顺便说一句我用下面的代码来创建上表:

library(igraph) 
library(dplyr) 

g <- data.frame(from = c("a", "b", "c", "d", "e"), 
       to = c("b", "a", "a", "b", "a"), weight = c(1:5)) %>% 
    igraph::graph_from_data_frame() 

现在我希望创建另一个表,列出两个边缘之间的向前和向后的信息,以及权重值,如:

enter image description here

有谁知道如何与igraph做到这一点?

+3

请不要以图片分享数据。人们无法将其复制到他们的R会话中。 – Axeman

+1

你如何确定要保留哪些行?你为什么选择“从c到a”而不是“从a到c”。你不一定需要一个独特的解决方案吗? – MrFlick

回答

1

首先,你可以得到共享对节点和边缘的名单,无论方向

simplified <- as.undirected(g, mode="collapse") 
pairs <- ends(simplified, E(simplified)) 

然后,我们可以写一个辅助函数在两个节点之间,如果它不”返回给定边的权牛逼存在,返回NA代替

get_edge_weight<- Vectorize(function(a, b) { 
    e <- E(g)[a %->% b] 
    if(length(e)==1) { 
    e$weight 
    } else { 
    NA 
    } 
}) 

然后你就可以用你建立所需data.frame

data.frame(from=pairs[,1], to=pairs[,2], 
    fwd=get_edge_weight(pairs[,1], pairs[,2]), 
    back=get_edge_weight(pairs[,2], pairs[,1]) 
) 
# from to fwd back 
# b a b 1 2 
# c a c NA 3 
# d b d NA 4 
# e a e NA 5 
+0

这非常有帮助,非常感谢! – tttokio