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



我认为我的例子很特别。由于我在使用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

请不要将您的列表称为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

也许以下内容符合您的要求
我首先设置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)

最新更新