计算中的R
问题描述:
配对函数例如我有一个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
}
是否有任何人知道如何做这个 ???谢谢你在前进
答
这会做你想要什么:
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()
正在处理矢量。
答
没有必要遍历行。如果您对函数进行了矢量化,则可以一次对其进行有效的处理。如果您不想更改它,请使用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
使用'?combn' – akrun
我大概知道如何做到这一点,但最好的方法显然取决于具体的例子(您想在特定的应用功能)。 – Roland
谢谢@jogo,我是一个在stackoverflow上的新手:) – Erika