我正在尝试基于二分图创建一个单一模式的同事网络。我有一个数据集,其中包含人员和他们工作的公司,以及他们在任何给定公司开始和结束工作的年份。
我想投影这个无向的二分网络,但只保留时间上重叠的边,这样只有同时在一家公司工作的人才能连接起来。
因此,在下面的示例中,我希望 person3 在投影后不要连接到 person1,因为在 person3 于 2009 年开始工作之前,person1 于 2008 年停止在 company2 工作。
我还需要投影边有一个权重属性,只要节点一起工作,它就会增加。例如,person1 和 person2 之间的投影边缘应该是 2,因为他们在 2009 年在公司 1 和 2007 年在公司 2 一起工作。
真实网络有数千个节点,因此解决方案不能涉及手动编辑单个边。我正在使用 igraph 和 tidygraph,但是任何其他软件包的解决方案都可以。任何从节点和边列表创建所需的单模网络而不从二分/双模图投影的解决方案也可以。
可重现的例子:
library(tidyverse)
library(igraph)
nodes_people <- data.frame(id=c("person1","person2","person3"), type="TRUE")
nodes_inst <- data.frame(id=c("company1","company2","company3"), type="FALSE")
nodes<-bind_rows(nodes_people, nodes_inst)
edges <- data.frame(from=c("person1","person1","person2","person3","person2","person3"),
to=c("company1","company2","company2","company3","company1","company2"),
start_date=c(2008,2007,2007,2003,2002,2009),
end_date=c(2010,2008,2012,2006,2009,2010))
g <- graph_from_data_frame(d=edges, vertices=nodes, directed=F)
is.bipartite(g)
g_one_mode<-bipartite_projection(g)$proj2
plot(g_one_mode)
二分图: 二分网络
单模网络: 单模