矩阵列中匹配值的计数

时间:2015-02-25 01:27:38

标签: r matrix linear-algebra matrix-multiplication transpose

我不确定如何正确地说出来,但我想计算列之间有相似之处的次数。

想象一下,我有下面列出的3支NFL球队。零是亏损,而胜利则是胜利。这些排是NFL赛季的一周。我想创建一个矩阵,显示每个NFL球队与其他球队有相同比赛结果的次数。我认为m%*%t(m)会给每对球队的计数产生相同的结果,但看起来并不正确。新的矩阵将是一个3x3,海豚喷气机票据沿着行和列穿过。因为它们没有意义,我会忽略对角线

  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

如果有其他方法来解决这个问题会很好,但是我很确定有一种方法可以通过线性代数操作来实现这一点,我只是卡住了

2 个答案:

答案 0 :(得分:3)

请注意,在比较两列时,我们有#{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

答案 1 :(得分:2)

你走在正确的轨道上:

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