【问题标题】:Compute a pairwise function in R在 R 中计算成对函数
【发布时间】:2017-02-24 09:22:20
【问题描述】:

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

有人知道怎么做吗???提前谢谢你

【问题讨论】:

  • 我可能知道如何做到这一点,但最好的方法显然取决于具体的例子(以及你要特别应用的功能)。
  • 谢谢@jogo,我是stackoverflow的新手:)

标签: r matrix


【解决方案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

【讨论】:

  • 谢谢!!!!当我尝试添加 colnames 时出现此错误 'colnames&lt;-(*tmp*, value = c("1vs2", "1vs3", "2vs3")) 中的错误:'dimnames' [2] 的长度不等于数组范围'
  • 给定的代码运行没有错误。如果你得到一个错误,你已经改变了一些东西。
【解决方案2】:

这会做你想做的事:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多