使用Igraph计算ego网络triad census并生成对应计数数据集
解决方法
首先确保你已经加载了igraph包,可选加载dplyr简化数据处理步骤,以下是可直接运行的完整代码:
# 加载依赖包 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") triads <- lapply(egonet_list, triad.census) # 新增转换为目标格式的代码 # 将三元组列表转为数据框 triad_df <- do.call(rbind, triads) %>% as.data.frame() # 匹配对应的student_id(ego节点ID) triad_df$student_id <- as.numeric(names(egonet_list)) # 设置列名,和目标格式完全对齐 colnames(triad_df) <- c( "triad_003", "triad_012", "triad_102", "triad_021D", "triad_021U", "triad_021C", "triad_111D", "triad_111U", "triad_030T", "triad_030C", "triad_201", "triad_120D", "triad_120U", "triad_120C", "triad_210", "triad_300", "student_id" ) # 调整列顺序,将student_id放在第一列,按student_id升序排列 result <- triad_df %>% select(student_id, everything()) %>% arrange(student_id) # 查看输出结果 print(result, row.names = FALSE)
如果不想依赖dplyr,可以用base R实现转换逻辑:
# base R版本转换代码 triad_df <- as.data.frame(do.call(rbind, triads)) triad_df$student_id <- as.numeric(names(egonet_list)) colnames(triad_df) <- c( "triad_003", "triad_012", "triad_102", "triad_021D", "triad_021U", "triad_021C", "triad_111D", "triad_111U", "triad_030T", "triad_030C", "triad_201", "triad_120D", "triad_120U", "triad_120C", "triad_210", "triad_300", "student_id" ) # 调整列顺序和排序 result <- triad_df[, c(ncol(triad_df), 1:(ncol(triad_df)-1))] result <- result[order(result$student_id), ]
逻辑说明
make_ego_graph返回的列表顺序和原图顶点顺序完全一致,列表的名称就是对应ego节点的ID,直接提取即可匹配student_idtriad.census返回的16个计数的顺序和需求的列顺序完全对应,直接设置列名即可- 最终输出的
result就是所需的结构化统计数据集,和示例目标格式完全匹配。
内容的提问来源于stack exchange,提问作者L. Tucker
相关产品推荐
相关产品推荐

