通过消除嵌套for循环来改进此代码

时间:2017-03-08 13:48:23

标签: r for-loop matrix functional-programming apply

R包corrplot包含其他内容,这个漂亮的功能

cor.mtest <- function(mat, conf.level = 0.95){
  mat <- as.matrix(mat)
    n <- ncol(mat)
    p.mat <- lowCI.mat <- uppCI.mat <- matrix(NA, n, n)
    diag(p.mat) <- 0
    diag(lowCI.mat) <- diag(uppCI.mat) <- 1
    for(i in 1:(n-1)){
        for(j in (i+1):n){
            tmp <- cor.test(mat[,i], mat[,j], conf.level = conf.level)
            p.mat[i,j] <- p.mat[j,i] <- tmp$p.value
            lowCI.mat[i,j] <- lowCI.mat[j,i] <- tmp$conf.int[1]
            uppCI.mat[i,j] <- uppCI.mat[j,i] <- tmp$conf.int[2]
        }
    }
    return(list(p.mat, lowCI.mat, uppCI.mat))
}

计算变量x_1,...,x_n的成对相关性的p值和置信区间,给出N变量的n观察值。该函数在输入中使用数字矩阵,并返回{3}个元素为3 list对称矩阵的nxn:这就是为什么在嵌套for循环内只有上层计算3个矩阵的对角线部分。例如:

res1 <- cor.mtest(mtcars,0.95)
> str(res1)
List of 3
 $ : num [1:11, 1:11] 0.00 6.11e-10 9.38e-10 1.79e-07 1.78e-05 ...
 $ : num [1:11, 1:11] 1 -0.926 -0.923 -0.885 0.436 ...
 $ : num [1:11, 1:11] 1 -0.716 -0.708 -0.586 0.832 ...

我认为(我可能错了)在{R}中for循环不是非常惯用的:我看到很多代码,人们用map函数系列替换它们{{1}来自purr的{​​{1}}函数系列。我想用这样的函数编程函数消除两个apply循环。你能告诉我怎么做吗?

0 个答案:

没有答案