如何在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))
对应表格:
| Docname | Cat1 | Cat2 | Cat3 | Cat4 | Cat5 |
|---|---|---|---|---|---|
| ABC1 | 0 | 0 | 1 | 1 | 0 |
| ABC2 | 0 | 0 | 0 | 1 | 1 |
| ABC3 | 1 | 0 | 1 | 0 | 1 |
| ABC4 | 0 | 0 | 0 | 0 | 1 |
| ABC5 | 1 | 1 | 0 | 0 | 1 |
期望输出
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))
对应表格:
| Tag | Cat1 | Cat2 | Cat3 | Cat4 | Cat5 |
|---|---|---|---|---|---|
| Cat1 | NA | 1 | 1 | 0 | 2 |
| Cat2 | 1 | NA | 0 | 0 | 0 |
| Cat3 | 1 | 0 | NA | 1 | 1 |
| Cat4 | 0 | 0 | 1 | NA | 1 |
| Cat5 | 2 | 0 | 1 | 1 | NA |
实际数据集约有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)
关键步骤说明
- 提取标签矩阵:通过
data_have[, -1]直接剔除第一列的文档名,转换为矩阵方便后续矩阵运算。 - 计算共现矩阵:矩阵乘法
t(tag_matrix) %*% tag_matrix会自动统计每对标签在同一文档中同时为1的次数总和,得到对称的共现矩阵。 - 处理对角线:将对角线值设为NA,符合输出示例中自身标签无统计值的要求。
- 格式调整:添加
Tag列并调整列顺序,匹配期望的输出结构。
关于tcrossprod的说明
tcrossprod(tag_matrix)和t(tag_matrix) %*% tag_matrix功能完全等价,之前结果不符合预期大概率是因为没有处理对角线的NA,或未调整为带Tag列的DataFrame格式,按上述步骤处理即可得到目标结果。
内容的提问来源于stack exchange,提问作者PositivePotato90
相关产品推荐
相关产品推荐

