R:使用列表中矩阵中的每个元素进行计算

时间:2018-07-23 09:30:31

标签: r matrix apply

我认为我的榜样很特别。由于我对lapply的使用尚不先进,因此我坚持进行以下计算。这是一个简短的复制示例:假设我有一个包含三个矩阵的列表:

list <- list(est1=matrix(sample(c(0,0.4,0.2,1), replace=TRUE, size=10), ncol=2), est2=matrix(sample(c(0,0.4,0.2,1), replace=TRUE, size=10), ncol=2),
    est3=matrix(sample(c(0,0.4,0.2,1), replace=TRUE, size=10), ncol=2))

$`est1`
     [,1] [,2]
[1,]  0.4  1.0
[2,]  0.0  0.4
[3,]  0.0  0.0
[4,]  0.0  0.4
[5,]  0.0  1.0

$est2
     [,1] [,2]
[1,]  0.0  0.2
[2,]  0.4  0.4
[3,]  1.0  0.0
[4,]  0.2  1.0
[5,]  0.4  0.4

$est3
     [,1] [,2]
[1,]  1.0  0.2
[2,]  0.4  1.0
[3,]  1.0  0.0
[4,]  1.0  0.2
[5,]  0.4  0.4

每个矩阵包含不同迭代的系数估计。一个矩阵内的每个元素都属于一个系数。我想计算系数不为零的三个矩阵的百分比。

预期输出:

[,1] [,2]
0.67 1
0.67 1
0.67 0
0.67 1
0.67 1

2 个答案:

答案 0 :(得分:3)

请勿致电您的列表list。在下文中,它将称为z

z <- list(est1=matrix(sample(c(0,0.4,0.2,1), replace=TRUE, size=10), ncol=2), est2=matrix(sample(c(0,0.4,0.2,1), replace=TRUE, size=10), ncol=2),
             est3=matrix(sample(c(0,0.4,0.2,1), replace=TRUE, size=10), ncol=2))

对于您描述的这类问题,我喜欢使用数组,因此第一步是将列表转换为数组。

library(abind)
A <- abind(list, along=3)

然后,您可以沿三维应用一个函数:

apply(A, 1:2, function(x) 100 * sum(x!=0) / length(x))

      [,1]  [,2]
[1,] 100.0 100.0
[2,] 100.0  66.7
[3,] 100.0  66.7
[4,] 100.0  66.7
[5,]  66.7  66.7

答案 1 :(得分:1)

也许以下是您想要的。
我首先设置RNG种子以使结果可重复

set.seed(2081)    # Make the results reproducible
list <- list(est1 = matrix(sample(c(0,0.4,0.2,1), replace=TRUE, size=10), ncol=2),
             est2 = matrix(sample(c(0,0.4,0.2,1), replace=TRUE, size=10), ncol=2),
             est3 = matrix(sample(c(0,0.4,0.2,1), replace=TRUE, size=10), ncol=2))

zeros <- sapply(list, `==`, 0)
res <- rowSums(zeros) / ncol(zeros)
matrix(res, ncol = 2)
#          [,1]      [,2]
#[1,] 0.3333333 0.3333333
#[2,] 0.0000000 0.6666667
#[3,] 0.0000000 0.3333333
#[4,] 0.3333333 0.3333333
#[5,] 0.6666667 0.3333333

编辑。

以下使用rowMeans并且更简单。结果是上面identical()res

res2 <- rowMeans(zeros)
identical(res, res2)
#[1] TRUE

matrix(res2, ncol = 2)