r语言 - 从1中减去存储在list的list中的矩阵中的所有值

  • 本文关键字:list 存储 r语言 r matrix purrr
  • 更新时间 :
  • 英文 :


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

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 - .)周围的另一种方式,但这不起作用。我意识到从矩阵中减去值比从矩阵中减去每个值要容易得多……在我的小例子中,我刚刚创建了一个3x3和4x4矩阵,只包含1,从中减去矩阵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替换矩阵中的所有值并从原始矩阵中减去这些值。但是,我做不到。也许你能帮我想出一个好的解决办法。

提前感谢!托比

lapply(lst, lapply, function(mat) 1 - mat)purrr溶液lst %>% modify_depth(2, ~ 1 - .x)将在第二级嵌套运行。

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


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

最新更新