首页 > 解决方案 > 一致性矩阵

问题描述

假设我有一个包含任意数量的行和列的数据集,如下所示。

tmp <- tibble(id = 1:10,
              v1 = c(0, 0, 0, 1, 1, 0, 0, 0, 0, 1),
              v2 = c(0, 0, 0, 1, 0, 0, 0, 0, 0, 1),
              v3 = c(0, 0, 0, 1, 0, 0, 0, 0, 1, 0),
              v4 = c(0, 0, 0, 1, 1, 0, 0, 0, 1, 0))

每一行都是一个响应。受访者对特定问题表示是 (1) 或否 (0)。在这里,我们有 4 个问题。

将其转换为如下一致矩阵的最简单方法是什么:

   v1  v2  v3  v4
v1 3   2   1   1
v2 2   2   1   1
v3 1   1   2   2
v4 1   1   2   3

每个单元格显示对行上的问题回答“是”的人,有多少人也对列上的问题回答“是”。

请注意,问题的数量可能大于 4,因此我不想在解决方案中硬编码变量名称。如果有帮助,我可以确保变量名称始终遵循特定格式。不关心变量名的解决方案是理想的(如果需要,我们可以删除 id 列)。

标签: rtidyverse

解决方案


最简单的方法是使用矩阵乘法...

mx <- as.matrix(tmp[,-1])

t(mx) %*% mx

   v1 v2 v3 v4
v1  3  2  1  2
v2  2  2  1  1
v3  1  1  2  2
v4  2  1  2  3

crossprod(mx)会做同样的事情。


推荐阅读