R语言滑动窗口引文网络构建及多网络中心性统计高效实现问询
高效实现方案
核心思路:放弃在全局环境生成22个独立对象的做法,改用列表批量处理中间结果,最后一次性合并所有统计值,既减少冗余代码也降低内存占用。
前置依赖
需要用到tidyverse做批量数据处理、igraph做网络分析,提前加载包:
library(tidyverse) library(igraph)
实现代码
步骤1:构造滑动窗口映射表
先把22个窗口的编号和对应起止年份整理成映射表,方便后续批量调用:
window_map <- tibble( window = 1:22, start_y = 1995:2016, end_y = start_y + 4 )
步骤2:批量计算所有窗口的中心性并合并结果
直接用purrr::pmap_dfr遍历每个窗口,计算完成后自动按行拼接为最终数据框,不需要单独存储22个网络对象:
final_centrality <- pmap_dfr(window_map, function(window, start_y, end_y) { # 过滤当前窗口的引文数据,聚合边权重 edge_data <- citations %>% filter(year >= start_y, year <= end_y) %>% rename(from = author_1, to = author_2) %>% group_by(from, to) %>% summarise(weight = sum(collaborations), .groups = "drop") # 构建加权网络,引文网络默认有向,按需调整directed参数 g <- graph_from_data_frame(edge_data, directed = TRUE) # 计算三类中心性,参数可按需调整 tibble( window = window, node = V(g)$name, degree = degree(g, weights = E(g)$weight), betweenness = betweenness(g, weights = E(g)$weight), closeness = closeness(g, weights = E(g)$weight) ) })
可选优化(数据量较大时使用)
如果原始数据量很大,可以用data.table替换dplyr的过滤聚合逻辑,速度提升明显:
library(data.table) setDT(citations) # 提前把数据转成data.table格式 # 把上面的edge_data生成逻辑替换为以下代码 edge_data <- citations[year >= start_y & year <= end_y, .(weight = sum(collaborations)), by = .(from = author_1, to = author_2)]
注意事项
- 原示例代码中存在列名笔误,数据中的作者列名为
author_1、author_2,需要和实际数据字段保持一致 - 中心性计算的归一化设置、加权逻辑可以根据研究需求调整对应函数的参数
- 如果需要无向网络,修改
graph_from_data_frame的directed参数为FALSE即可
内容的提问来源于stack exchange,提问作者Nanna
相关产品推荐
相关产品推荐

