首页 > 解决方案 > 结果列表的成对矩阵

问题描述

假设我们有一个矩阵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被解释为“对象i优于对象jX 次”。示例:在 2 种情况下,对象 2 的性能优于对象 1。在 7 个案例中,对象 1 的性能优于对象 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和汇总,但没有得到有用的结果。

标签: rreshape2

解决方案


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

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

推荐阅读