我不确定如何正确地说出来,但我想计算列之间有相似之处的次数。
想象一下,我有下面列出的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
如果有其他方法来解决这个问题会很好,但是我很确定有一种方法可以通过线性代数操作来实现这一点,我只是卡住了
答案 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