例如我有一个矩阵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
}
有人知道怎么做吗???提前谢谢
答案 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()
正在处理向量。