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

如何在R语言中生成求和型邻接矩阵

问题描述

我有一个x行n列的DataFrame,每行代表一篇文档,每列代表一个标签类别,单元格值为0(标签与文档无关)或1(标签与文档关联)。目标是将该xn的DataFrame转换为nn的求和邻接矩阵,统计不同标签类别在所有文档中的共现次数,最终用于社交网络分析可视化。

示例输入

data_have <- data.frame(Docname=c('ABC1', 'ABC2', 'ABC3', 'ABC4', 'ABC5'),
                    Cat1 = c(0,0,1,0,1),
                    Cat2 = c(0,0,0,0,1),
                    Cat3 = c(1,0,1,0,0),
                    Cat4 = c(1,1,0,0,0),
                    Cat5 = c(0,1,1,1,1))

对应表格:

DocnameCat1Cat2Cat3Cat4Cat5
ABC100110
ABC200011
ABC310101
ABC400001
ABC511001

期望输出

data_want <- data.frame(Tag=c('Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5'),
                    Cat1 = c(NA,1,1,0,2),
                    Cat2 = c(1,NA,0,0,0),
                    Cat3 = c(1,0,NA,1,1),
                    Cat4 = c(0,0,1,NA,1),
                    Cat5 = c(2,0,1,1,NA))

对应表格:

TagCat1Cat2Cat3Cat4Cat5
Cat1NA1102
Cat21NA000
Cat310NA11
Cat4001NA1
Cat52011NA

实际数据集约有50个标签类别,无法手动计算。尝试了miscset包的squarematrix函数得到列表而非矩阵,使用tcrossprod函数结果不符合预期,寻求正确的R语法实现方法。


解决方案

核心思路是提取标签列的数值矩阵,计算两两标签的共现次数,再调整格式匹配需求。

完整实现代码

# 示例数据
data_have <- data.frame(Docname=c('ABC1', 'ABC2', 'ABC3', 'ABC4', 'ABC5'),
                    Cat1 = c(0,0,1,0,1),
                    Cat2 = c(0,0,0,0,1),
                    Cat3 = c(1,0,1,0,0),
                    Cat4 = c(1,1,0,0,0),
                    Cat5 = c(0,1,1,1,1))

# 1. 提取标签列的数值矩阵(剔除Docname列)
tag_matrix <- as.matrix(data_have[, -1])

# 2. 计算两两标签的共现次数矩阵
# t(tag_matrix) %*% tag_matrix 等价于 tcrossprod(tag_matrix)
cooccur_matrix <- t(tag_matrix) %*% tag_matrix

# 3. 将对角线值替换为NA(自身与自身的共现无意义)
diag(cooccur_matrix) <- NA

# 4. 转换为目标格式的DataFrame并调整列顺序
result_df <- as.data.frame(cooccur_matrix)
result_df$Tag <- rownames(result_df)
result_df <- result_df[, c("Tag", setdiff(colnames(result_df), "Tag"))]

# 查看结果
print(result_df)

关键步骤说明

  1. 提取标签矩阵:通过data_have[, -1]直接剔除第一列的文档名,转换为矩阵方便后续矩阵运算。
  2. 计算共现矩阵:矩阵乘法t(tag_matrix) %*% tag_matrix会自动统计每对标签在同一文档中同时为1的次数总和,得到对称的共现矩阵。
  3. 处理对角线:将对角线值设为NA,符合输出示例中自身标签无统计值的要求。
  4. 格式调整:添加Tag列并调整列顺序,匹配期望的输出结构。

关于tcrossprod的说明

tcrossprod(tag_matrix)和t(tag_matrix) %*% tag_matrix功能完全等价,之前结果不符合预期大概率是因为没有处理对角线的NA,或未调整为带Tag列的DataFrame格式,按上述步骤处理即可得到目标结果。

内容的提问来源于stack exchange,提问作者PositivePotato90

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:52:35