如何在 r 中创建相似度矩阵?

How do I create similarity matrices in r?

我有一个矩阵,行是立法者,列是问题,值表示立法者如何对给定问题进行投票(0 - 缺席,1 - 赞成,2 - 反对)。我需要为每个问题创建一个相似性矩阵(如果两位立法者都出席投票,他们是否以相同的方式投票)。在 r 中有没有使用嵌套 for 循环的快速方法?

矩阵如下所示:

    I1 I2 I3 I4
L1   1  1  1  2
L2   1  1  0  0
L3   2  2  2  2
L4   2  2  0  0

这是第一期我想得到的:

   L1 L2 L3 L4
L1     1  0  0
L2  1     0  0
L3  0  0     1
L4  0  0  1

你可以试试

func <- function(a, b) {ifelse(a==b & a*b != 0, 1, 0)}

lapply(dummy, function(x) {
  res <-outer(x, x, func)
  diag(res) <- NA
  colnames(res) = rownames(res) = c("L1", "L2", "L3", "L4")
  res
  })


$I1
   L1 L2 L3 L4
L1 NA  1  0  0
L2  1 NA  0  0
L3  0  0 NA  1
L4  0  0  1 NA

$I2
   L1 L2 L3 L4
L1 NA  1  0  0
L2  1 NA  0  0
L3  0  0 NA  1
L4  0  0  1 NA

$I3
   L1 L2 L3 L4
L1 NA  0  0  0
L2  0 NA  0  0
L3  0  0 NA  0
L4  0  0  0 NA

$I4
   L1 L2 L3 L4
L1 NA  0  1  0
L2  0 NA  0  0
L3  1  0 NA  0
L4  0  0  0 NA

数据

dummy <- read.table(text = "    I1 I2 I3 I4
   1  1  1  2
   1  1  0  0
   2  2  2  2
   2  2  0  0", header = T)
rownames(dummy) <- c("L1", "L2", "L3", "L4")

   I1 I2 I3 I4
L1  1  1  1  2
L2  1  1  0  0
L3  2  2  2  2
L4  2  2  0  0