过渡边缘属性从二分图到一个模式图

时间:2017-11-23 11:57:10

标签: r igraph edges

我想从二分图中采用一个模式图的边缘属性作为命令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

有没有人知道如何保留此edge属性或如何正确索引它,以便以后可以访问它?提前谢谢!

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

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

也许这张经过精心编辑的图片有助于:

enter image description here

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

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

1 个答案:

答案 0 :(得分:1)

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

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. year数据框中创建一个新变量(el),并使用ifelse语句为该变量指定正确的值。
  4. 这特定于两个事件场景,但可以轻松扩展。如果您不知道将要获得的事件数量,您可以使用循环。

    <强>代码

    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)