我想从二分图中采用一个模式图的边缘属性作为命令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
。
也许这张经过精心编辑的图片有助于:
因此,您可以看到边缘基本上是事件,但不幸的是,有关年份的信息丢失了。 也许这可以解决问题。
感谢您的帮助到目前为止: - )
答案 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)
修改强>
<强>解释强> 我找到的解决方案是:
el
转换为dataframe
event1
和event2
)year
数据框中创建一个新变量(el
),并使用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)