Igraph中如何仅计算自我网络alter节点密度(排除ego节点)
解决方案
你可以通过双参数遍历函数同时配对自我网络列表和对应的ego节点ID,批量执行删除+密度计算逻辑,以下是兼容你现有代码的实现:
完整实现代码
library(igraph) library(dplyr) # 读入数据 df<-read.table(text="student_id alter 1 3 2 5 2 2 2 3 3 2 3 4 3 5 4 1 4 6 4 3 5 1 5 6 5 2 6 5 6 2 6 1 7 8 8 9 9 8 9 7 10 7 10 9 11 19 11 15 11 12 12 20 12 19 12 11 13 15 13 19 13 11 14 16 14 12 14 18 15 17 15 20 15 17 16 14 16 19 16 20 16 13 17 20 17 18 17 13 17 14 18 13 18 19 18 17 19 17 19 16 19 11 20 13 20 17 20 11 20 1", header = TRUE) # 构建网络、生成ego网络列表 g <- graph_from_data_frame(df, directed = TRUE) egonet_list <- make_ego_graph(g, order = 1, mode = "out") student_ids <- names(V(g)) # 批量计算排除ego的alter子网络密度(基础R写法) alter_density <- unlist(Map(function(net, ego_id) { delete_vertices(net, ego_id) %>% graph.density() }, egonet_list, student_ids)) # 生成结果表 dat <- data.frame( student_id = student_ids, alter_egonet_density = alter_density )
如果你习惯使用purrr做迭代,也可以用更简洁的写法替换密度计算部分:
library(purrr) dat <- data.frame( student_id = student_ids, alter_egonet_density = map2_dbl(egonet_list, student_ids, ~delete_vertices(.x, .y) %>% graph.density()) )
逻辑说明
make_ego_graph返回的列表顺序和V(g)的节点顺序完全对应,第i个自我网络的ego节点就是names(V(g))[i],通过双参数遍历函数可以直接把每个网络和对应的egoID配对,逐个删除ego节点后计算密度即可。你可以验证student_id=18的结果,和你单独计算的结果完全一致。
内容的提问来源于stack exchange,提问作者L. Tucker
相关产品推荐
相关产品推荐

