如何通过 igraph 中的顶点相关数缩放边相关数?
how to scale edge related number by a vertex related number in igraph?
我有一个由 igraph
包中的函数 graph.data.frame
创建的图形数据框。我的边包含有关 "strength of the relation" 的信息,我的节点包含有关 "strength of the node".
的信息
我想做的是通过它们相关的各个节点的强度来衡量关系的强度。
对于我的可重现示例,我将使用 igraph
文档中的设置(键入 ?graph.data.frame
并向下滚动)。我绘制了各个参与者之间的关系,并使用 advice
列作为关系强度的指标。出于某种疯狂的原因,我想通过建议接受者和提供者的平均年龄来衡量建议质量的价值。
我可以在创建图形数据框之前进行缩放(我的边和节点是两个独立的data.tables所以我所要做的就是一堆连接+一些魔法作为我的实际情况比下面的例子复杂一点),但我很好奇igraph数据框创建后如何做。
actors <- data.frame(name=c("Alice", "Bob", "Cecil", "David",
"Esmeralda"),
age=c(48,33,45,34,21),
gender=c("F","M","F","M","F"))
relations <- data.frame(from=c("Bob", "Cecil", "Cecil", "David",
"David", "Esmeralda"),
to=c("Alice", "Bob", "Alice", "Alice", "Bob", "Alice"),
same.dept=c(FALSE,FALSE,TRUE,FALSE,FALSE,TRUE),
friendship=c(4,5,5,2,1,1), advice=c(4,5,5,4,2,3))
# create graph data frame
# note that i treat the network as undirected here
g <- graph.data.frame(relations, directed=FALSE, vertices=actors)
print(g, e=TRUE, v=TRUE)
# plot a graph of the network
plot(g,
edge.label = edge_attr(g, 'advice'),
vertex.label = paste0(vertex_attr(g, 'name'),
'\nage = ',
vertex_attr(g, 'age')))
您要计算的关键是 ends
函数,它给出了一条边的两端。
E(g)$ScaledAdvice = 0
for(e in E(g)) {
E(g)$ScaledAdvice[e] = E(g)$advice[e] / mean(V(g)[ends(g, e)]$age)
}
我有一个由 igraph
包中的函数 graph.data.frame
创建的图形数据框。我的边包含有关 "strength of the relation" 的信息,我的节点包含有关 "strength of the node".
我想做的是通过它们相关的各个节点的强度来衡量关系的强度。
对于我的可重现示例,我将使用 igraph
文档中的设置(键入 ?graph.data.frame
并向下滚动)。我绘制了各个参与者之间的关系,并使用 advice
列作为关系强度的指标。出于某种疯狂的原因,我想通过建议接受者和提供者的平均年龄来衡量建议质量的价值。
我可以在创建图形数据框之前进行缩放(我的边和节点是两个独立的data.tables所以我所要做的就是一堆连接+一些魔法作为我的实际情况比下面的例子复杂一点),但我很好奇igraph数据框创建后如何做。
actors <- data.frame(name=c("Alice", "Bob", "Cecil", "David",
"Esmeralda"),
age=c(48,33,45,34,21),
gender=c("F","M","F","M","F"))
relations <- data.frame(from=c("Bob", "Cecil", "Cecil", "David",
"David", "Esmeralda"),
to=c("Alice", "Bob", "Alice", "Alice", "Bob", "Alice"),
same.dept=c(FALSE,FALSE,TRUE,FALSE,FALSE,TRUE),
friendship=c(4,5,5,2,1,1), advice=c(4,5,5,4,2,3))
# create graph data frame
# note that i treat the network as undirected here
g <- graph.data.frame(relations, directed=FALSE, vertices=actors)
print(g, e=TRUE, v=TRUE)
# plot a graph of the network
plot(g,
edge.label = edge_attr(g, 'advice'),
vertex.label = paste0(vertex_attr(g, 'name'),
'\nage = ',
vertex_attr(g, 'age')))
您要计算的关键是 ends
函数,它给出了一条边的两端。
E(g)$ScaledAdvice = 0
for(e in E(g)) {
E(g)$ScaledAdvice[e] = E(g)$advice[e] / mean(V(g)[ends(g, e)]$age)
}