R语言基于dataframe构建加权邻接矩阵的高效实现方法
R语言构建加权邻接矩阵的高效实现
核心思路
无需手写嵌套循环遍历单元格,通过向量化操作构造「来源列→引用值」的配对数据,过滤无效引用后直接统计频次转换为矩阵,底层调用C实现的统计逻辑,执行效率远高于手动循环方案。
基础R实现(无外部依赖)
# 测试数据 dat <- data.frame(A=c("D", "A", "D", "B"), B=c("B", "B", "D", "R"), C=c("A", "D", "C", ""), D=c("D", "C", "A", "A")) names_d <- colnames(dat) # 构造来源-目标配对 pairs <- data.frame( source = rep(names_d, each = nrow(dat)), target = unlist(dat, use.names = FALSE) ) # 过滤不属于列名的无效引用 pairs <- pairs[pairs$target %in% names_d, ] # 统计频次生成矩阵 mat <- as.matrix(table(pairs$source, pairs$target))
超大数据量优化方案(data.table实现)
如果你的数据量达到十万行以上,用data.table的melt+聚合逻辑速度会更快:
library(data.table) setDT(dat) names_d <- colnames(dat) # 宽表转长表+过滤+聚合统计 pairs <- melt(dat, measure.vars = names_d, variable.name = "source", value.name = "target") pairs <- pairs[target %in% names_d, .N, by = .(source, target)] # 长表转宽表生成矩阵 mat <- dcast(pairs, source ~ target, value.var = "N", fill = 0)[, -1] |> as.matrix() rownames(mat) <- names_d
输出结果
两种方案最终得到的矩阵和预期完全一致:
A B C D A 1 1 0 2 B 0 2 0 1 C 1 0 1 1 D 2 0 1 1
内容的提问来源于stack exchange,提问作者user2246905
相关产品推荐
相关产品推荐

