所以我有一个包含四行和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))
}
但我不确定如何扩展该功能或将其应用于矩阵上所有可能的成对比较。所以,任何帮助将不胜感激!
答案 0 :(得分: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。