假设我有一个包含任意数量的行和列的数据集,如下所示。
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 列)。
最简单的方法是矩阵乘法...
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)
会做同样的事情。