矩阵列中匹配值的计数

Count of matching values in matrix columns

我不太确定如何正确表达这一点,但我想计算各列之间相似的次数。

假设我有下面列出的 3 支 NFL 球队。零是损失,一是胜利。这些行是 NFL 赛季的一周。我想创建一个矩阵来显示每支 NFL 球队与其他球队有多少次相同的比赛结果。我在想 m %*% t(m) 会给出每对具有相同结果的团队的计数,但它看起来并不正确。新矩阵将是一个 3x3 的矩阵,其中 dolphins-jets-bills 沿着行向下并穿过列。我会忽略对角线,因为它们毫无意义

  dolphins=c(1,0,1)
  jets= c(0,1,0)
   bills = c(1,1,1)
   m=matrix(c(dolphins, jets,bills),3,3)
   colnames(m)=c("dolphins","jets","bills")
   m
   solution = matrix(c(1,0,2,0,1,1,2,1,1),3,3)
   solution

如果有其他方法可以解决这个问题,那就太好了,但我很确定有一种方法可以用线性代数运算来解决这个问题,我只是被卡住了

请注意,在比较两列时我们有 #{the same outcome} = nrow(m) - #{different outcomes}。这表明我们可以在列之间使用 Manhattan distance。这可以通过以下方式完成:

nrow(m) - dist(t(m), method = "manhattan", diag = TRUE, upper = TRUE)
#          dolphins jets bills
# dolphins        0    0     2
# jets            0    0     1
# bills           2    1     0
solution
#      [,1] [,2] [,3]
# [1,]    1    0    2
# [2,]    0    1    1
# [3,]    2    1    1

你走在正确的轨道上:

result <- t(m) %*% m
         dolphins jets bills
dolphins        2    0     2
jets            0    1     1
bills           2    1     3

或者,

 result <- crossprod(m)

编辑 我在下面的评论中提醒我,当团队在同一周输球时,他们的结果是一样的。

可以考虑到这一点
result <- crossprod(m) + crossprod(1-m)

如果你想在主对角线上有 1,只需这样做:

diag(result) <- 1

         dolphins jets bills
dolphins        1    0     2
jets            0    1     1
bills           2    1     1