从 1 中减去存储在列表的列表中的矩阵中的每个值

Substract every value in matrices stored in a list of a list from 1

我有几个列表存储在一个列表中。每个列表包含八个矩阵。每个列表中的矩阵长度相等,但列表之间的长度不同。这里有一个小例子可以给你一个想法:

a <- matrix(c(1, 0.2, 0.3, 0.4, 1, 0.6, 0.7, 0.8, 1), 3, 3)
b <- matrix(c(1, 0.2, 0.3, 0.4, 1, 0.6, 0.7, 0.8, 1), 3, 3, byrow = T)
c <- matrix(c(1, 0.1, 0.15, 0.2, 0.25, 1, 0.35, 0.4, 0.45, 0.5, 1, 0.6, 0.65, 0.7, 0.75, 1), 4, 4)
d <- matrix(c(1, 0.1, 0.15, 0.2, 0.25, 1, 0.35, 0.4, 0.45, 0.5, 1, 0.6, 0.65, 0.7, 0.75, 1), 4, 4, byrow = T)

lst1 <- list(a = a, b = b)
lst2 <- list(c = c, d = d)

lst <- list(lst1 = lst1, lst2 = lst2)

lst
$lst1
$lst1$a
     [,1] [,2] [,3]
[1,]  1.0  0.4  0.7
[2,]  0.2  1.0  0.8
[3,]  0.3  0.6  1.0

$lst1$b
     [,1] [,2] [,3]
[1,]  1.0  0.2  0.3
[2,]  0.4  1.0  0.6
[3,]  0.7  0.8  1.0


$lst2
$lst2$c
     [,1] [,2] [,3] [,4]
[1,] 1.00 0.25 0.45 0.65
[2,] 0.10 1.00 0.50 0.70
[3,] 0.15 0.35 1.00 0.75
[4,] 0.20 0.40 0.60 1.00

$lst2$d
     [,1] [,2] [,3] [,4]
[1,] 1.00  0.1 0.15  0.2
[2,] 0.25  1.0 0.35  0.4
[3,] 0.45  0.5 1.00  0.6
[4,] 0.65  0.7 0.75  1.0

我想做的是将每个矩阵中的每个值都从1中减去,并将原始值替换为计算出的值。结果我想得到:

$lst1
$lst1$a
     [,1] [,2] [,3]
[1,]  0.0  0.6  0.3
[2,]  0.8  0.0  0.2
[3,]  0.7  0.4  0.0

$lst1$b
     [,1] [,2] [,3]
[1,]  0.0  0.8  0.7
[2,]  0.6  0.0  0.4
[3,]  0.3  0.2  0.0


$lst2
$lst2$c
     [,1] [,2] [,3] [,4]
[1,] 0.00 0.75 0.55 0.35
[2,] 0.90 0.00 0.50 0.30
[3,] 0.85 0.65 0.00 0.25
[4,] 0.80 0.60 0.40 0.00

$lst2$d
     [,1] [,2] [,3] [,4]
[1,] 0.00  0.9 0.85  0.8
[2,] 0.75  0.0 0.65  0.6
[3,] 0.55  0.5 0.00  0.4
[4,] 0.35  0.3 0.25  0.0

我以为我可以用类似于 lst %>% modify(~. - 1) 的任何东西来做到这一点,但反过来 lst %>% modify(~1 - .),但这不起作用。我意识到从矩阵中减去值比从一个值中减去矩阵中的每个值要容易得多......在我的小例子中,我刚刚创建了一个仅包含 1 的 3x3 和 4x4 矩阵,从中减去矩阵 a-d 并存储再次出现在列表中:

e <- matrix(1, 3, 3)
f <- matrix(1, 4, 4)

a <- e-a
b <- e-b
c <- f-c
d <- f-d

lst1 <- list(a = a, b = b)
lst2 <- list(c = c, d = d)

lst <- list(lst1 = lst1, lst2 = lst2)

然后我想我可以将矩阵中的所有值替换为 1,然后从原始矩阵中减去这些值。但是,我无法管理它。也许你可以帮我解决一个好的 purrr 问题。

提前致谢! 托比

lapply(lst, lapply, function(mat) 1 - mat)purrr 解决方案 lst %>% modify_depth(2, ~ 1 - .x) 将在嵌套的第二层运行。

或者,rapply(lst, function(mat) 1 - mat, classes = "matrix", how = "replace") 将对位于任意嵌套级别的矩阵元素进行运算。


选择第一个或第二个选项取决于对输入结构的假设是什么、事先检查它们的严格程度以及所需的回退行为。因此,一些额外的逻辑必须单独实现。