从二分图到单模图的过渡边属性
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)
编辑
说明
我找到的解决方案是:
- 将
el
转换成dataframe
- 为每个事件创建新数据框(
event1
和 event2
)
- 在
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)
我想为作为命令 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)
编辑
说明 我找到的解决方案是:
- 将
el
转换成dataframe
- 为每个事件创建新数据框(
event1
和event2
) - 在
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)