You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从时序加权无向网络列表提取节点中心性指标?

加权无向网络时间演化分析:提取节点中心性指标

问题背景

研究加权无向网络的时间演化,已生成分年份的网络列表并计算了节点中心性属性,但无法正确提取这些指标;查看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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 01:15:42