R获取列的所有组合并对它们执行函数返回对称矩阵?

时间:2014-01-27 07:14:33

标签: r matrix combinations apply symmetric

我有一个矩阵mat,如下所示:

      A     B     C     D      E     F
1  0.74  1.19  0.01  1.21  16000  0.02
2  0.76  1.17  0.01  1.21  15500  0.02
3  0.79  1.16  0.01  1.17  15625  0.02
4  0.75  1.17  0.01  1.17  15600  0.02
5  0.80  1.19  0.01  1.19  15225  0.02
6  0.79  1.18  0.01  1.18  15625  0.02

我想通过应用函数Sum(Col1-Col2)来构建对称矩阵。最终结果将如下所示:

    A     B     C     D      E     F
A   0
B         0
C               0
D                     0
E                            0
F                                  0

这样空格代表差异的总和。即[1,2] = Sum(A-B)

我调查了以下方法:

combs<-combn(names(mat),2)
val<-apply(combs,2,function(x) mat[[x[1]]]-mat[[x[2]]])

但它没有给我一个很好的对称矩阵。

有人有什么想法吗?

感谢。

编辑 - 感谢特洛伊上述作品。但是,如果我想在Sum((Col1-Col2)^2)中计算Sum(((A_1,A_2,..,A_n)-(B_1,B_2,..,B_n))^2)(因此最初无法求和AB,然后减去否则答案将会关闭)。< / p>

2 个答案:

答案 0 :(得分:2)

mat<-as.matrix(read.table(text="A     B     C     D      E     F
0.74  1.19  0.01  1.21  16000  0.02
0.76  1.17  0.01  1.21  15500  0.02
0.79  1.16  0.01  1.17  15625  0.02
0.75  1.17  0.01  1.17  15600  0.02
0.80  1.19  0.01  1.19  15225  0.02
0.79  1.18  0.01  1.18  15625  0.02", header=T))


cross<-expand.grid(apply(mat,2,sum),apply(mat,2,sum))
matrix(cross[,1]-cross[,2],6)

[,1]     [,2]     [,3]     [,4]      [,5]     [,6]
[1,]     0.00    -2.43     4.57    -2.50 -93570.37     4.51
[2,]     2.43     0.00     7.00    -0.07 -93567.94     6.94
[3,]    -4.57    -7.00     0.00    -7.07 -93574.94    -0.06
[4,]     2.50     0.07     7.07     0.00 -93567.87     7.01
[5,] 93570.37 93567.94 93574.94 93567.87      0.00 93574.88
[6,]    -4.51    -6.94     0.06    -7.01 -93574.88     0.00

第二个问题,这个怎么样?

编辑 - 我认为我把括号放错了地方

apply(mat,2,function(x)colSums((matrix(x,ncol(mat),ncol(mat))-mat)^2))
#             A            B           C            D          E            F
#A 0.000000e+00 9.881000e-01 3.48390e+00 1.048400e+00 1459547504 3.393100e+00
#B 9.881000e-01 0.000000e+00 8.16740e+00 2.100000e-03 1459471669 8.028000e+00
#C 3.483900e+00 8.167400e+00 0.00000e+00 8.332500e+00 1459690004 6.000000e-04
#D 1.048400e+00 2.100000e-03 8.33250e+00 0.000000e+00 1459469476 8.191700e+00
#E 1.459548e+09 1.459472e+09 1.45969e+09 1.459469e+09          0 1.459688e+09
#F 3.393100e+00 8.028000e+00 6.00000e-04 8.191700e+00 1459688132 0.000000e+00

答案 1 :(得分:2)

这似乎也是有效的:

outer(colSums(mat), colSums(mat), `-`)  #I used Troy's `mat`
#         A        B        C        D         E        F
#A     0.00    -2.43     4.57    -2.50 -93570.37     4.51
#B     2.43     0.00     7.00    -0.07 -93567.94     6.94
#C    -4.57    -7.00     0.00    -7.07 -93574.94    -0.06
#D     2.50     0.07     7.07     0.00 -93567.87     7.01
#E 93570.37 93567.94 93574.94 93567.87      0.00 93574.88
#F    -4.51    -6.94     0.06    -7.01 -93574.88     0.00

编辑以匹配已修改的问题:

n = seq_len(ncol(mat))
ff = function(a, b) sum((mat[,a] - mat[,b]) ^ 2)
outer(n, n, Vectorize(ff))
#             [,1]         [,2]        [,3]         [,4]       [,5]         [,6]
#[1,] 0.000000e+00 9.881000e-01 3.48390e+00 1.048400e+00 1459547504 3.393100e+00
#[2,] 9.881000e-01 0.000000e+00 8.16740e+00 2.100000e-03 1459471669 8.028000e+00
#[3,] 3.483900e+00 8.167400e+00 0.00000e+00 8.332500e+00 1459690004 6.000000e-04
#[4,] 1.048400e+00 2.100000e-03 8.33250e+00 0.000000e+00 1459469476 8.191700e+00
#[5,] 1.459548e+09 1.459472e+09 1.45969e+09 1.459469e+09          0 1.459688e+09
#[6,] 3.393100e+00 8.028000e+00 6.00000e-04 8.191700e+00 1459688132 0.000000e+00