首页 文章

在矩阵上的行的成对组合上应用函数

提问于
浏览
0

所以我有一个有四行和x列的矩阵(这并不重要) . 我想将一个函数应用于不同行的所有可能的成对组合,即一个遍及“row1 - row2”,“row1 - row3”等所有6种可能组合的函数,并计算一个值 .

想象一下矩阵看起来像这样:

[,1]      [,2]      [,3]      [,4]
0.6923077 1.0000000 0.6153846 1.0000000
1.0000000 0.9444444 0.5833333 0.7142857
1.0000000 1.0000000 1.0000000 1.0000000
1.0000000 0.9090909 0.0000000 0.0000000

为进一步说明,该函数如下所示:

2*matrix[1,1]*(1-matrix[2,1])+2*matrix[2,1]*(1-matrix[1,1])

例如,第一行和第二行之间的比较将是:

2*0.6923077*(1-1.0000000)+2*1.0000000*(1-0.6923077)

为第一个位置 . 然后我需要为所有其他列计算相同的值,最后计算平均值 . 我创建了一个函数,当输入是两个向量时(考虑到矩阵的行本身只是一个向量),它能够做到这一点:

test <- function(row1, row2) {
HB <- 2*row1*(1-row2)+2*row2*(1-row1)
return(mean(HB))
}

但我不确定如何扩展该功能或将其应用于矩阵上所有可能的成对比较 . 所以,任何帮助将不胜感激!

1 回答

  • 2

    正如@Imo指出的那样, combn 是解决此类问题的方法:

    combn(nrow(myMat), 2, function(x) test(myMat[x[1], ], myMat[x[2],]))
    [1] 0.5648657 0.3461539 1.0069930 0.3789683 0.7169913 1.0454546
    

    数据:

    txt <- "0.6923077 1.0000000 0.6153846 1.0000000
            1.0000000 0.9444444 0.5833333 0.7142857
            1.0000000 1.0000000 1.0000000 1.0000000
            1.0000000 0.9090909 0.0000000 0.0000000"
    
    myMat <- as.matrix(read.table(text = txt))
    

    这是实际发生的事情:

    combn(nrow(myMat), 2)
         [,1] [,2] [,3] [,4] [,5] [,6]
    [1,]    1    1    1    2    2    3
    [2,]    2    3    4    3    4    4
    

    这里我们简单地创建 myMat 中行数的所有双向组合 . combn 可以接受一个函数,所以使用你的函数 test ,我们只需对每个组合应用test .

相关问题