我有一个简单的问题,我无法找到一个简单的解决方案。我有一个10个节点的完整图表
require(igraph)
g <- ba.game(10, directed = FALSE)
g[V(g), V(g)] <- TRUE
g <- simplify(g)
节点的属性value
包含一个数字,但也可能缺少值。
set.seed(2)
df <- data.frame(id = 1:10,
value = sample(c(1:10, NA), 10, replace = T))
V(g)$value <- df$value
现在我想计算节点值之间的差异并将其存储在相应的边缘。我创建了图表的边缘列表
el <- as.data.frame(get.edgelist(g))
添加与每个节点对应的值。
el <- merge(el, df, by.x = 'V1', by.y = 'id')
el <- merge(el, df, by.x = 'V2', by.y = 'id')
并计算绝对差值
el$diff <- abs(el$value.x - el$value.y)
此时我会假设如果我将边缘列表中的值插入边缘,我将完成任务
E(g)$diff <- el$diff
但实际上边缘似乎没有订购,事实上如果我这样做
plot(g, vertex.label = V(g)$value, edge.label = E(g)$diff)
我立即看到某些东西不起作用,边缘值随机分布。
答案 0 :(得分:0)
E(g)返回一个与el行不同的edgelist。作为快速修复,请将两个调用的顺序更改为merge,以便&#34; by.x =&#39; V2&#39;&#34;是第一个&#34; by.x =&#39; V1&#39;&#34;是第二个。