一致性矩阵

Mer*_*rik 3 r tidyverse

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

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))
Run Code Online (Sandbox Code Playgroud)

每一行都是一个响应。受访者对特定问题的回答是是 (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
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*tar 6

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

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
Run Code Online (Sandbox Code Playgroud)

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