0

我正在尝试基于二分图创建一个单一模式的同事网络。我有一个数据集,其中包含人员和他们工作的公司,以及他们在任何给定公司开始和结束工作的年份。

我想投影这个无向的二分网络,但只保留时间上重叠的边,这样只有同时在一家公司工作的人才能连接起来。

因此,在下面的示例中,我希望 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)

二分图: 二分网络

单模网络: 单模

4

0 回答 0