减去矩阵中的所有排列

时间:2017-04-21 18:23:07

标签: r

我为这个非常基本的问题道歉,但经过几个小时的搜索,我还没有找到答案。我有一个矩阵,有5个重复(1:5)的变量(cADP)

cADP2
      [,1]
[1,] -3.932778
[2,] -3.807778
[3,] -3.515652
[4,] -2.853333
[5,] -2.054667

我想计算每个变量的所有排列之间的减法,即1-2,1-3,1-4,1-5,2-3,2-4,2-5,3-4, 3-5,4-5 但无法弄清楚所需的代码。非常感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

尝试使用“ - ”outer作为函数:

cADP2 <- c(-3.932778,-3.807778,-3.515652,-2.853333,-2.054667)
outer(cADP2,cADP2,"-")

         [,1]      [,2]      [,3]      [,4]      [,5]
[1,] 0.000000 -0.125000 -0.417126 -1.079445 -1.878111
[2,] 0.125000  0.000000 -0.292126 -0.954445 -1.753111
[3,] 0.417126  0.292126  0.000000 -0.662319 -1.460985
[4,] 1.079445  0.954445  0.662319  0.000000 -0.798666
[5,] 1.878111  1.753111  1.460985  0.798666  0.000000

如果您想要这种矩阵的长格式,可以使用来自reshape的融合:

res <- outer(cADP2,cADP2,"-")
melt(res)
   X1 X2     value
1   1  1  0.000000
2   2  1  0.125000
3   3  1  0.417126
4   4  1  1.079445
5   5  1  1.878111
...

如果您只想要排列的一侧(1-2但不是2-1),则可以使用upper.trilower.tri。这将为您提供一个向量:

res <- outer(cADP2,cADP2,"-")
res[upper.tri(res)]

-0.125000 -0.417126 -0.292126 -1.079445 -0.954445 -0.662319 -1.878111 -1.753111 -1.460985 -0.798666