【问题标题】:Count of matching values in matrix columns矩阵列中匹配值的计数
【发布时间】:2015-02-25 01:27:37
【问题描述】:

我不太确定如何正确表达这一点,但我想计算一下列之间有多少相似之处。

假设我有下面列出的 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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 非常感谢您的帮助。看起来我在正确的轨道上我只需要切换矩阵的顺序和转置乘法!
      猜你喜欢
      • 2018-01-21
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 2019-12-10
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多