从二分图到单模图的过渡边属性

Transition edge attributes from bipartite to one mode graphs

我想为作为命令 bipartite_projection 结果的单模图采用二分图中的边属性。

library(igraph)

data <- data.frame( people= c(letters[1:5],letters[5:8],"a"),
             events=c(1,1,1,1,1,2,2,2,2,2),
             year=c(2004,2004,2004,2004,2004,2005,2005,2005,2005,2005))

g <- graph_from_data_frame(data)
V(g)$type <-  V(g)$name %in% data[,1] # Nodes are the people 
E(g)$year                             # this is what I want
proj <- bipartite.projection(g)

g2 <- proj[[2]]

问题从这里开始

E(g2)$year                       # here it is gone

el <- get.edgelist(g2)
el <- cbind(el, E(g)$year)    # ideally add it here to the edgelist

有谁知道如何保留这个边缘属性或如何正确索引它,以便以后可以访问它?提前致谢!

编辑澄清(感谢@Heikki 和@dllhell 的编辑建议):

这背后的想法是从时间网络中获取边缘列表。节点是人,边是事件。这些事件发生在某些年份。要知道哪些人在同一年的同一事件中相遇,我使用 bipartite_projection.

也许这张经过严重编辑的图片有帮助:

正如您所见,边缘基本上是事件,但不幸的是,有关年份的信息丢失了。 也许这可以解决问题。

感谢您到目前为止的帮助:-)

可能的解决方案,尝试让我知道它是否有效:

library(igraph)

data <- data.frame( people= c(letters[1:5],letters[5:8],"a"),
                    events=c(1,1,1,1,1,2,2,2,2,2),
                    year=c(2004,2004,2004,2004,2004,2005,2005,2005,2005,2005))

g <- graph_from_data_frame(data)
V(g)$type <-  V(g)$name %in% data[,1] # Nodes are the people 
data$year_2 <- E(g)$year                             # this is what I want
proj <- bipartite.projection(g)

g2 <- proj[[2]]

E(g2)$year                       # here it is gone

el <- get.edgelist(g2)

el <- as.data.frame(el)

colnames(el)[1] <- "people"
el <- merge(el,data$year_2)

编辑

说明 我找到的解决方案是:

  1. el转换成dataframe
  2. 为每个事件创建新数据框(event1event2
  3. el 数据框中创建一个新变量 (year) 并使用 ifelse 语句为该变量分配正确的值。

这是特定于两个事件的场景,但可以轻松扩展。如果你不知道你会得到多少个事件,你可以只使用一个循环。

代码

library(igraph)

data <- data.frame( people= c(letters[1:5],letters[5:8],"a"),
                    events=c(1,1,1,1,1,2,2,2,2,2),
                    year=c(2004,2004,2004,2004,2004,2005,2005,2005,2005,2005))

g <- graph_from_data_frame(data)
V(g)$type <-  V(g)$name %in% data[,1] # Nodes are the people 
 E(g)$year                             # this is what I want
proj <- bipartite.projection(g)

g2 <- proj[[2]]

E(g2)$year                       # here it is gone

el <- get.edgelist(g2)

el <- as.data.frame(el)


event1 <- subset(data, events == 1)
event2 <- subset(data, events == 2)
el$year <- 0
el$year <- ifelse(el$V1 %in% event1$people & el$V2 %in% event1$people,  unique(event1$year), el$year )
el$year <-ifelse(el$V1 %in% event2$people & el$V2 %in% event2$people,unique(event2$year), el$year)