r - 找到反向边并从其相反方向减去其权重

标签 r igraph subtraction undirected-graph

我有一个像下面这样的矩阵

m <- expand.grid(LETTERS[1:24],LETTERS[1:24])
m$weight <- runif(nrow(m), 0.01, max = 1)
m <- m[m$Var1!=m$Var2, ] ##remove loop edges
colnames(m) = c("to","from","weight")

并以这种形式描述了一个有向图。我想要做的是减去每对逆边并取其绝对值,并创建一个描述新无向图的新矩阵。即:

abs( edge_weight(A,B) - edge_weight(B,A) )

但我不知道如何只考虑每对一次。

最佳答案

使用igraph

library(igraph)

#dataframe to directed graph
directed_graph <- graph.data.frame(m, directed = T)

#convert to undirected graph by applying desired function
undirected_graph <- as.undirected(directed_graph, mode = "collapse", 
                                  edge.attr.comb = list(weight = function(x) abs(x[1] - x[2])))

#final result
df <- as.data.frame(cbind(get.edgelist(undirected_graph), 
                          unlist(get.edge.attribute(undirected_graph))))
colnames(df) <- c("edge1", "edge2", "weight")
rownames(df) <- NULL

给出

> head(df)
  edge1 edge2             weight
1     B     C  0.310624073725194
2     B     D  0.587582074650563
3     C     D 0.0327853348944336
4     B     E   0.19360910307616
5     C     E  0.328824346032925
6     D     E   0.13037203295622


示例数据:

set.seed(123)

m <- expand.grid(LETTERS[1:24], LETTERS[1:24])
m$weight <- runif(nrow(m), 0.01, max = 1)
m <- m[m$Var1 != m$Var2, ]
colnames(m) <- c("to", "from", "weight")

关于r - 找到反向边并从其相反方向减去其权重,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51167671/

相关文章:

r - 并行计算时函数参数中的变量不会传递给集群

r - 计算R中的稀疏成对距离矩阵

r - 组合多个文件,同时保持其身份

r - 如何在 R 中仅绘制大型社区/集群

python - 如何更改 python igraph 中的边方向?

algorithm - 计算机对两个大数进行乘法、除法、减法、加法是否比较小的数花费更多的时间

返回数据帧列表中两个字符串之间的值 [R]

r - Kou 使用 igraph 查找 Steiner 树的算法

swift - 枚举函数并在 swift 上用新值减去旧值

c++ - unsigned char的减法运算