繁体   English   中英

在R中计算成对函数

[英]Compute a pairwise function in R

例如,我有一个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  
}

有谁知道如何做到这一点 ??? 先感谢您

无需遍历行。 如果对向量进行矢量化处理,则可以一次为所有这些对象高效地完成此操作。 如果您不想更改,请使用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

这将做您想要的:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM