我真的不知道如何正确地使用这个词,但我想统计一下列之间相似的次数。
想象一下,我有下面列出的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
如果有其他方法可以解决这个问题,那就太好了,但我很确定有一种方法可以用线性代数运算来解决这个问题
请注意,当比较两列时,我们有#{the same outcome} = nrow(m) - #{different outcomes}
。这表明我们可以使用列之间的曼哈顿距离。这可以通过以下方式实现:
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