计算R中的成对函数

时间:2017-02-24 09:22:20

标签: r matrix

例如我有一个矩阵3x3,我想应用我在[1,1]&& [1,2]然后[1,1]&& [1,3]之间做的函数然后[1,2]&& [1,3](组合)。

然后我去下一行

这是我的矩阵

的一个例子
     [,1] [,2] [,3]
[1,] -0.2 0.52 0.36
[2,] -0.2 0.66 0.50
[3,]  0.8 0.10 1.00

我必须应用此功能:

Fst <- function ( x,y ) {
  F = sd(c(x,y)) / (mean(c(x,y)) * (1-mean(c(x,y))))
  F  
}

有人知道怎么做吗???提前谢谢

2 个答案:

答案 0 :(得分:1)

无需循环遍历行。如果您对函数进行矢量化,则可以立即对所有这些函数进行有效的处理。如果您不想更改,请使用Vectorize

m <- matrix(c(-0.2, -0.2, 0.8, 0.52, 0.66, 0.10, 0.36, 0.50, 1), 3)

library(matrixStats)
Fst_vectorized <- function ( x,y ) {
  X <- cbind(x, y)
  F = rowSds(X) / (rowMeans(X) * (1-rowMeans(X)))
  F  
}

Fst(m[1,1], m[1,2])
#[1] 3.788072

res <- combn(as.data.frame(m), 2, FUN = function(x) Fst_vectorized(x[[1]], x[[2]]))
colnames(res) <-  combn(seq_len(ncol(m)), 2, 
                        FUN = function(x) paste(x[[1]], x[[2]], sep = "vs"))
#         1vs2     1vs3      2vs3
#[1,] 3.788072 5.380160 0.4591602
#[2,] 3.433720 3.882155 0.4644380
#[3,] 1.999898 1.571348 2.5712974

答案 1 :(得分:0)

这将做你想要的:

m <- matrix(c(-0.2, 0.52, 0.36,  -0.2, 0.66, 0.50,  0.8, 0.10, 1.00), 3, 3, byrow=TRUE)
m    
myfun <- function(x) {
  apply(combn(x,2), 2, function(x) sd(x) / mean(x) / (1-mean(x)) )
}
apply(m, 1, myfun)
# > apply(m, 1, myfun)
#           [,1]     [,2]     [,3]
# [1,] 3.7880720 3.433720 1.999898
# [2,] 5.3801603 3.882155 1.571348
# [3,] 0.4591602 0.464438 2.571297

apply(m, 1, myfun)适用于每一行(第一行的结果将是结果矩阵中的第一个元素,即第一列中的元素)。 combn(x,2)生成对 - 在矩阵中按列存储,请参阅combn(11:15, 2)。另一个apply()正在处理该矩阵的每一列 我更改了您的功能,因为sd()mean()正在处理向量。