合并IGraph时维护属性名称 问题

合并IGraph时维护属性名称 问题,r,merge,igraph,R,Merge,Igraph,我有两个独立的网络,没有重叠的节点或边,它们都有相同的属性。我想把这两个网络合并成一个网络,然后由两个不同的组件组成 但是,当我尝试使用union命令合并它们时,属性将从“attribute”重命名为“attribute_1”和“attribute_2”。命令帮助文件中说明了这一点,但我找不到一种明显的方法来合并这两个网络 下面的代码块显示了这种情况 library(igraph) #create a 4 node network of two components adjmat <-

我有两个独立的网络,没有重叠的节点或边,它们都有相同的属性。我想把这两个网络合并成一个网络,然后由两个不同的组件组成

但是,当我尝试使用
union
命令合并它们时,属性将从“attribute”重命名为“attribute_1”和“attribute_2”。命令帮助文件中说明了这一点,但我找不到一种明显的方法来合并这两个网络

下面的代码块显示了这种情况

library(igraph)

#create a 4 node network of two components
adjmat <- rep(0, 16)
adjmat[c(2,5,12,15)] <- 1
g <-  graph.adjacency(matrix(adjmat, nrow = 4) , mode = "undirected") 

#give attributes naming the nodes and the edges
g <- set_vertex_attr(g, "name", value = paste0("Node_", 1:4))
g <- set_edge_attr(g, "name", value = paste0("Edge_",1:2))

#I am interested in the type attribute
g <- set_edge_attr(g, "type", value = c("foo", "bar"))

plot(g)

#Decompose into seperate networks
gList <- decompose(g)

g2 <-union(gList[[1]], gList[[2]])

#vertices are fine but edges have been renamed as stated in the helpfile for union.
get.edge.attribute(g2)
get.vertex.attribute(g2)
库(igraph)
#创建由两个组件组成的4节点网络

adjmat我制作了以下版本的union,它接受具有任意数量重叠属性的两个图形,并将它们合并到一个图形中,其中属性没有“x”后缀。这些图可以是完全独立的,也可以有重叠的节点。 在重叠节点的情况下,图1的属性优先

library(dplyr)
library(igraph)

union2<-function(g1, g2){

 #Internal function that cleans the names of a given attribute
 CleanNames <- function(g, target){
  #get target names
  gNames <- parse(text = (paste0(target,"_attr_names(g)"))) %>% eval 
  #find names that have a "_1" or "_2" at the end
  AttrNeedsCleaning <- grepl("(_\\d)$", gNames )
  #remove the _x ending
  StemName <- gsub("(_\\d)$", "", gNames)

  NewnNames <- unique(StemName[AttrNeedsCleaning])
  #replace attribute name for all attributes
  for( i in NewnNames){

   attr1 <- parse(text = (paste0(target,"_attr(g,'", paste0(i, "_1"),"')"))) %>% eval
   attr2 <- parse(text = (paste0(target,"_attr(g,'", paste0(i, "_2"),"')"))) %>% eval

   g <- parse(text = (paste0("set_",target,"_attr(g, i, value = ifelse(is.na(attr1), attr2, attr1))"))) %>%
             eval

   g <- parse(text = (paste0("delete_",target,"_attr(g,'", paste0(i, "_1"),"')"))) %>% eval
   g <- parse(text = (paste0("delete_",target,"_attr(g,'", paste0(i, "_2"),"')"))) %>% eval

   }

  return(g)
 }


 g <- igraph::union(g1, g2) 
 #loop through each attribute type in the graph and clean
 for(i in c("graph", "edge", "vertex")){
 g <- CleanNames(g, i)
 }

 return(g)

}
库(dplyr)
图书馆(igraph)

回答得很好。这是否可以扩展为接受
n
图形列表?使用Reduce(union2,list(…))。然后列表中的每个图形将合并为一个图形。我想我们有一个非常相似的问题!
library(dplyr)
library(igraph)

union2<-function(g1, g2){

 #Internal function that cleans the names of a given attribute
 CleanNames <- function(g, target){
  #get target names
  gNames <- parse(text = (paste0(target,"_attr_names(g)"))) %>% eval 
  #find names that have a "_1" or "_2" at the end
  AttrNeedsCleaning <- grepl("(_\\d)$", gNames )
  #remove the _x ending
  StemName <- gsub("(_\\d)$", "", gNames)

  NewnNames <- unique(StemName[AttrNeedsCleaning])
  #replace attribute name for all attributes
  for( i in NewnNames){

   attr1 <- parse(text = (paste0(target,"_attr(g,'", paste0(i, "_1"),"')"))) %>% eval
   attr2 <- parse(text = (paste0(target,"_attr(g,'", paste0(i, "_2"),"')"))) %>% eval

   g <- parse(text = (paste0("set_",target,"_attr(g, i, value = ifelse(is.na(attr1), attr2, attr1))"))) %>%
             eval

   g <- parse(text = (paste0("delete_",target,"_attr(g,'", paste0(i, "_1"),"')"))) %>% eval
   g <- parse(text = (paste0("delete_",target,"_attr(g,'", paste0(i, "_2"),"')"))) %>% eval

   }

  return(g)
 }


 g <- igraph::union(g1, g2) 
 #loop through each attribute type in the graph and clean
 for(i in c("graph", "edge", "vertex")){
 g <- CleanNames(g, i)
 }

 return(g)

}
g4 <-union2(gList[[1]], gList[[2]])

#As we would like
get.edge.attribute(g4)
get.vertex.attribute(g4)