[英]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.