使用igraph设置顶点属性提示替换长度不匹配警告如何解决
问题根因
- 核心矛盾:
graph_from_data_frame()接收的前两列为边的起点、终点,生成图的顶点是这两列所有值去重后的结果,顶点数和原边表数据框的行数完全不相等。你直接把边表的列直接赋值给顶点属性,自然会出现长度不匹配的警告,同时也会导致属性和顶点对应错位。 - 额外错误:你后续试图从边
E(graph)中取screen_name属性,但该属性是你定义的顶点属性,边本身没有这个属性,取值必然出错。 - 度数属性赋值注意:
igraph::degree()返回的向量顺序和顶点顺序完全对应,不要对结果做排序后再赋值为顶点属性,否则会出现度数和顶点不匹配的问题。
修复方案
首先需要先整理唯一顶点对应的属性映射表,再按照图中顶点的实际顺序匹配属性后再赋值,参考代码如下:
library(dplyr) library(igraph) # 读取边表数据 df <- read.csv(".../test.csv") # 生成初始图结构 graph <- graph_from_data_frame(df %>% select(id, parent), directed = F) # 整理顶点属性映射表:每个唯一id对应一行属性,去除重复值 node_attr_df <- df %>% select(id, user.screen_name, parent) %>% distinct(id, .keep_all = T) # 提取图中顶点的默认name顺序(即你传入的id、parent列的取值) node_order <- V(graph)$name # 按照顶点顺序匹配对应属性 matched_screen_name <- node_attr_df$user.screen_name[match(node_order, node_attr_df$id)] matched_id <- node_attr_df$id[match(node_order, node_attr_df$id)] matched_parent <- node_attr_df$parent[match(node_order, node_attr_df$id)] # 批量赋值顶点属性,无警告、匹配正确 graph <- graph %>% set_vertex_attr("screen_name", value = matched_screen_name) %>% set_vertex_attr("id", value = matched_id) %>% set_vertex_attr("parent", value = matched_parent) %>% set_vertex_attr("degrees", value = degree(graph)) # 正确取度数等于10的顶点的screen_name V(graph)$screen_name[V(graph)$degrees == 10]
注意:如果存在顶点只出现在parent列、未出现在id列的情况,匹配后会返回NA,你可以根据业务需求填充默认值或者提前过滤这类无属性的顶点。
内容的提问来源于stack exchange,提问作者Eli
相关产品推荐
相关产品推荐

