igraph union函数合并子图时丢失权重及顶点属性问题求解
问题原因
igraph的union()函数默认不会自动保留输入图的顶点、边属性,需要显式指定属性合并规则,否则所有自定义属性都会在合并后丢弃,自然就会出现有权图合并后变无权、顶点属性丢失的现象。
修复方案
调用union()时补充vertex.attr.comb和edge.attr.comb参数指定属性合并策略,因为你确认两个子图无属性冲突,直接使用identical规则校验属性一致并保留即可,代码示例如下:
reduced_graph <- igraph::union( reduced_graphs[[1]], reduced_graphs[[2]], # 顶点属性合并规则:校验所有顶点属性值一致后保留 vertex.attr.comb = "identical", # 边属性合并规则:校验所有边属性值一致后保留,若存在同边出现在两个子图的情况,可按需调整权重合并规则 edge.attr.comb = "identical" )
如果两个子图中可能存在相同的边,你需要保留权重求和结果,可以调整边属性规则:
reduced_graph <- igraph::union( reduced_graphs[[1]], reduced_graphs[[2]], vertex.attr.comb = "identical", # 权重单独按求和规则合并,其余属性校验一致后保留 edge.attr.comb = list(weight = "sum", .default = "identical") )
如果需要一次性合并列表中全部5个子图,直接传入列表即可,参数规则不变:
reduced_graph_all <- igraph::union( reduced_graphs, vertex.attr.comb = "identical", edge.attr.comb = list(weight = "sum", .default = "identical") )
验证
合并完成后再次执行属性校验即可确认问题修复:
is_weighted(reduced_graph) # 预期输出 TRUE head(V(reduced_graph)$type) # 预期输出顶点type属性值而非NULL head(V(reduced_graph)$color) # 预期输出顶点color属性值而非NULL
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

