结果列表的成对矩阵

Pairwise matrix to list of outcomes

假设我们有一个矩阵M

M       <- matrix(c(1:9),3,3)
diag(M) <- NA
M
     [,1] [,2] [,3]
[1,]   NA    4    7
[2,]    2   NA    8
[3,]    3    6   NA

其中每个条目都描述了成对交互的结果。行 i 与列 j 的每次交互都被解释为 "object i outperformed object j X times"。示例:在两种情况下,对象 2 的性能优于对象 1。对象 1 在 7 种情况下表现优于对象 3。

有没有一种快速的方法可以将这个矩阵转换成一个对象,以一种格式保存这些信息,其中每一行都完整地描述了两个对象之间的交互?目标是这样的:

     [,1]   [,2]   [,3] [,4]
[1,] "OBJ1" "OBJ2" "N1" "N2"
[2,] "1"    "2"    "4"  "2" 
[3,] "1"    "3"    "7"  "3" 
[4,] "2"    "3"    "8"  "6" 

其中前两列给出了比较的对象,而第 3 列和第 4 列描述了 OBJ1 优于 OBJ2 的频率,反之亦然。第一行的解释是:对象 1 的表现优于对象 2 4 次,而对象 2 的表现优于对象 1 2 次。到目前为止,我一直在玩弄 reshape2 并聚合但没有有用的结果。

也许你可以试试下面的代码

inds <- t(combn(dim(M)[1], 2))
Mout <- `colnames<-`(
    cbind(inds, M[inds], M[inds[, 2:1]]),
    do.call(paste0, rev(expand.grid(1:2, c("Obj", "N"))))
)

这给出了

> Mout
     Obj1 Obj2 N1 N2
[1,]    1    2  4  2
[2,]    1    3  7  3
[3,]    2    3  8  6

另一种解决方案可能是:

M       <- matrix(c(1:9),3,3)
diag(M) <- NA
M1 <- M

M[upper.tri(M, diag=TRUE)] <- NA
M1[lower.tri(M1, diag=TRUE)] <- NA

R1 = reshape2::melt(M1, na.rm=TRUE, value.name="N1")
R2 = reshape2::melt(M, na.rm=TRUE, value.name="N2")

R1$N2 <- R2$N2
rownames(R1) <- NULL

输出:

> R1
  Var1 Var2 N1 N2
1    1    2  4  2
2    1    3  7  3
3    2    3  8  6