R语言如何从tidygraph对象列表中按条件删除无效对象
解决方案
你可以利用tidygraph兼容igraph函数的特性,结合列表过滤工具实现批量筛选,以下是两种常用实现方式:
基于tidyverse生态的方案
使用purrr::keep筛选同时符合要求的tidygraph对象,代码简洁易读:
library(purrr) library(tidygraph) library(dplyr) myList_filtered <- myList %>% keep( ~ ecount(.x) > 0 # 条件1:边数大于0,排除无边对象 && !any(is.na(pull(activate(.x, "nodes"), name))) # 条件2:节点name列无NA )
参数说明:
ecount()是igraph的原生函数,可以直接读取tidygraph对象的边数activate(.x, "nodes")用于切换到tidygraph的节点数据表进行操作- 如果你的节点标识列名不是
name,替换pull()内的列名即可
基础R实现方案
如果你不想引入额外依赖,可以用基础R的Filter函数实现相同效果:
library(tidygraph) library(dplyr) myList_filtered <- Filter(function(tg) { ecount(tg) > 0 && !any(is.na(pull(activate(tg, "nodes"), name))) }, myList)
运行上述代码后,myList_filtered中就只会保留同时满足「有边数据」和「节点name无NA」的有效对象,所有无效对象会被自动移除。
内容的提问来源于stack exchange,提问作者Electrino
相关产品推荐
相关产品推荐

