邻接矩阵预处理:补全缺失的双向链接
解决方案
针对你的网络链接补全需求,我们可以通过宽格式转长格式提取链接→生成反向链接→去重→转回宽格式的流程高效处理,既避免手动操作,又适配你68000个节点的大规模数据:
步骤1:提取所有已存在的单向链接
先把宽格式的dataframe转成"源节点-目标节点"的长格式,过滤掉NA值,得到所有已记录的链接:
library(tidyverse) # 原始数据 A <- data.frame(A = c("B",NA,NA,NA), B = c("C","D",NA,NA), C = c(NA,NA,NA,NA), D = c("A",NA,NA,NA)) # 转长格式,提取有效链接 links_long <- A %>% pivot_longer(cols = everything(), names_to = "source", values_to = "target") %>% filter(!is.na(target))
这一步会得到一个2列的dataframe,每一行对应一个source→target的单向链接。
步骤2:生成反向链接并合并去重
基于已有的链接生成反向的target→source链接,再和原始链接合并、去重,得到完整的双向链接集合:
# 生成反向链接 reverse_links <- links_long %>% rename(source = target, target = source) # 合并原始链接和反向链接,去重避免重复添加已存在的双向链接 full_links <- bind_rows(links_long, reverse_links) %>% distinct()
步骤3:转回宽格式匹配原始数据结构
把去重后的长格式链接转回宽格式,每个源节点对应所有目标节点,不足的用NA填充,保持每行一个目标的结构:
# 按源节点分组整理目标列表,再转成宽格式 B <- full_links %>% group_by(source) %>% summarise(targets = list(target)) %>% pivot_wider(names_from = source, values_from = targets) %>% unnest_wider(everything(), names_repair = "minimal") %>% mutate(across(everything(), ~ replace_na(.x, NA)))
运行后得到的B就是你需要的双向链接补全后的dataframe,和示例输出一致。
大规模数据适配优化
针对你68000个节点的场景,推荐用data.table提升处理速度(内存占用更低、运算更快),核心逻辑不变:
library(data.table) # data.table版本实现 setDT(A) links_long <- melt(A, variable.name = "source", value.name = "target", na.rm = TRUE) reverse_links <- links_long[, .(source = target, target = source)] full_links <- unique(rbind(links_long, reverse_links)) # 转回宽格式 B <- dcast(full_links, rowid(source) ~ source, value.var = "target")[, !"rowid"]
内容的提问来源于stack exchange,提问作者tony13s
相关产品推荐
相关产品推荐

