tidygraph与igraph从DataFrame构建图的差异问题排查
问题原因与解决方案
嘿,我明白你遇到的这个问题了,咱们一步步来拆解:
为什么直接用tbl_graph()会报错?
igraph和tidygraph处理顶点ID的逻辑有本质区别:
- igraph的
graph_from_data_frame()会先以你传入的vertices数据框里的id列作为顶点的唯一标识,再去匹配边列表里的from/to值,完全尊重你自定义的ID规则。 - 但tidygraph的
tbl_graph()默认逻辑是先根据边列表里的from/to数值创建顶点(把这些数值当作顶点的内部索引),再尝试添加你传入的节点数据。
你的边列表里的from/to是离散的用户ID(比如2、4、8、512这些),这些数值远大于你节点数据框的行数(你的node只有6行)。当tbl_graph先根据边创建顶点时,会生成到最大ID(512)为止的顶点,这时候再添加你那6个节点时,计算需要新增的顶点数是6 - 512 = -506,负数自然就触发了那个错误。
怎么解决?
很简单,只需要给tbl_graph()加一个node_key参数,明确告诉它用节点数据框里的id列来匹配边列表里的from/to,而不是默认的行号或自动生成的索引:
# 修正后的代码 tidy_net <- tbl_graph(nodes = node, edges = edge, directed = F, node_key = "id")
运行这段代码后,你就能正常创建tidygraph对象了,和用igraph生成的图结构完全一致,也能正常执行plot(tidy_net)。
至于为什么as_tbl_graph(test_net)能正常工作?因为test_net是已经用igraph正确构建的图,顶点ID已经和你的用户ID绑定了,转换成tbl_graph时直接继承了这个正确的映射关系,自然不会出问题。
内容的提问来源于stack exchange,提问作者aterhorst
相关产品推荐
相关产品推荐

