结果列表的成对矩阵
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
假设我们有一个矩阵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