我有一个由 x 行和 n 列组成的数据框。每行代表一个文档,每列代表与该文档关联的标签类别。每个单元格中的值为 0(表示标签与文档不关联)或 1(表示标签与文档关联)。我的目标是将这个 x * n 数据帧折叠成一个 n * n 求和邻接(?)矩阵,以便可视化标签类别在所有文档中组合在一起的频率。
我很抱歉,我是这种类型的分析新手,所以我在这里可能没有使用正确的术语......
例如,我当前可能有以下数据框:
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
如您所见,第二个矩阵 (data_want) 显示文档中每个标签类别一起出现的实例的总和。例如,在本例中,类别 1 与类别 5 在文档中出现了两次。
理想情况下,我的最终目标是能够将最终矩阵输入到社交网络分析可视化中,这样我就可以直观地看到每个标签类别与所有其他标签类别的连接程度。但这个矩阵只是查看配对簇最常出现的位置的第一步。您对可以实现此目的的 R 语法有什么建议吗?
就上下文而言,我的实际数据集大约有 50 个标签类别,所以我绝对无法轻松地手动计算它。
尝试
我尝试了miscset包中的squarematrix,这导致了一个列表对象而不是矩阵。
data_want1 = 方阵(data_have)
按照另一个 stackoverflow 示例,我还尝试了“tcrossprod”,但没有创建所需的输出
matrix_want <- as.matrix(data_have[-1])
resultMat <- tcrossprod(matrix_want)
diag(resultMat) <- 0
结果矩阵(matrix_want):
V1 V2 V3 V4 V5
0 1 1 0 0
1 0 1 1 1
1 1 0 1 2
0 1 1 0 1
0 1 2 1 0
老实说,我真的很困惑如何完成这个......我什至不知道从哪里开始,而且我所有的谷歌搜索似乎都没有指向正确的程序类型。很抱歉没有更多关于我在这里尝试做的事情的例子!
提前致谢!
这是对角线设置为
NA
s 的矩阵乘法:
m = as.matrix(data_have[-1])
result = t(m) %*% m
diag(result) = NA
result
# Cat1 Cat2 Cat3 Cat4 Cat5
# Cat1 NA 1 1 0 2
# Cat2 1 NA 0 0 1
# Cat3 1 0 NA 1 1
# Cat4 0 0 1 NA 1
# Cat5 2 1 1 1 NA