2017-02-24 72 views
0

配对函数例如我有一个3×3矩阵,我想申请是我[1,1] & & [1,2]然后[1,1] & & [1之间进行的功能, 3]然后[1,2] & & [1,3](组合)。计算中的R

然后我去到下一行

这是我的矩阵

 [,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 
} 

是否有任何人知道如何做这个 ???谢谢你在前进

+1

使用'?combn' – akrun

+2

我大概知道如何做到这一点,但最好的方法显然取决于具体的例子(您想在特定的应用功能)。 – Roland

+0

谢谢@jogo,我是一个在stackoverflow上的新手:) – Erika

回答

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()正在处理矢量。

+0

谢谢你很多!!!! – Erika

+0

http://stackoverflow.com/help/someone-answers – jogo

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 
+0

谢谢!!!!当我尝试添加colnames时,出现错误'colnames <-'('* tmp *',value = c(“1vs2”,“1vs3”,“2vs3”))中的错误): 'dimnames' 2]不等于数组范围' – Erika

+0

这段代码运行时没有错误。如果你得到一个错误,你改变了一些东西。 – Roland