如何从时序加权无向网络列表提取节点中心性指标?
加权无向网络时间演化分析:提取节点中心性指标
问题背景
研究加权无向网络的时间演化,已生成分年份的网络列表并计算了节点中心性属性,但无法正确提取这些指标;查看graph.cc整体时触发错误,仅单年份(如2011)可正常访问。需要将各年份的节点中心性指标整理为数据框列表。
原始数据与代码
数据示例
el_cc <- data.frame(from = c("BEL", "LUX", "FRN", "UKG","BEL", "LUX", "FRN", "UKG"), to = c("FRN", "UKG", "DEN", "CND","FRN", "UKG", "DEN", "CND"), weight = c(1,2,3,4,5,6,7,8), year = c(2010,2010,2010,2010,2011,2011,2011,2011))
原始图构建代码
cc <- split(el_cc, el_cc$year) get.graphs <- function(data){ # Select columns data[(names(data) %in% c("from", "to", "weight"))] # Remove duplicate dyads data <- data %>% rowwise() %>% mutate(tmp = paste(sort(c(from,to)), collapse = '')) data <- data[!duplicated(data$tmp),] data$tmp <- NULL # Create graph g <- graph_from_data_frame(data, directed = FALSE) # Degree centrality g$degreecent <- degree(g, mode="total", normalized = TRUE) # Betweenness centrality g$betweenness <- betweenness(g, v = V(g), directed = FALSE, nobigint = TRUE, normalized = TRUE) # k-core g$kcore <- coreness(g, mode="all") return(g) } graph.cc <- lapply(cc, get.graphs)
遇到的错误
查看graph.cc整体时触发错误:
Error in adjacent_vertices(x, i, mode = if (directed) "out" else "all") : At iterators.c:763 : Cannot create iterator, invalid vertex id, Invalid vertex id
问题修正与指标提取方案
1. 修正图构建代码的错误
原始代码中,data[(names(data) %in% c("from", "to", "weight"))]未赋值回data,导致后续处理仍包含多余列,这是触发错误的核心原因。同时将中心性指标作为节点属性存储(而非图的全局属性),符合igraph规范且便于提取。
修正后的get.graphs函数:
library(dplyr) library(igraph) get.graphs <- function(data){ # 过滤并保留需要的列 data <- data[(names(data) %in% c("from", "to", "weight"))] # 去重无向边 data <- data %>% rowwise() %>% mutate(tmp = paste(sort(c(from,to)), collapse = '')) %>% distinct(tmp, .keep_all = TRUE) %>% select(-tmp) # 创建无向加权图 g <- graph_from_data_frame(data, directed = FALSE) # 将中心性指标设置为节点属性 V(g)$degreecent <- degree(g, mode="total", normalized = TRUE) V(g)$betweenness <- betweenness(g, v = V(g), directed = FALSE, nobigint = TRUE, normalized = TRUE) V(g)$kcore <- coreness(g, mode="all") return(g) } # 重新生成图列表 graph.cc <- lapply(cc, get.graphs)
2. 提取各年份的中心性指标为数据框列表
编写提取函数,遍历每个年份的图,整合节点名称与中心性指标为数据框,并添加年份列:
extract_centrality <- function(graph_list){ lapply(names(graph_list), function(year){ g <- graph_list[[year]] data.frame( node = V(g)$name, year = as.integer(year), degreecent = V(g)$degreecent, betweenness = V(g)$betweenness, kcore = V(g)$kcore, stringsAsFactors = FALSE ) }) %>% setNames(names(graph_list)) } # 生成中心性指标数据框列表 centrality_list <- extract_centrality(graph.cc)
3. 结果查看与扩展
- 查看单年份数据:
centrality_list$2010`` - 合并所有年份数据到单个数据框(可选):
all_centrality <- do.call(rbind, centrality_list) rownames(all_centrality) <- NULL
说明
修正后的代码解决了无效顶点ID错误,centrality_list是一个以年份为名称的列表,每个元素对应该年份所有节点的中心性指标数据框,可直接用于时间演化分析。
内容的提问来源于stack exchange,提问作者Djoustaine
相关产品推荐
相关产品推荐

