将“dimnames”分配给列表中的所有矩阵时出错

error in assign `dimnames` to all matrices in a list

我使用了这个帖子中的解决方案 但我没有得到我需要的东西。

我有一个包含 4 个矩阵的列表,我想将它们的列和行命名为相同的名称。

A = list(a = matrix(1:4, 2), b = matrix(2:5, 2))

G = list(a = matrix(10:13, 2), b = matrix(5:8, 2))

M_1 = list(a = matrix(10:13, 2), b = matrix(5:8, 2))

M_2 = list(a = matrix(2:5, 2), b = matrix(5:8, 2))

dlist4 <- tibble::lst(A, G, M_1, M_2)
Map(function(x) {dimnames(x) <- list(c("seed","plant"), c("seed","plant")); x}, dlist4)

lapply(dlist4, function(x) {dimnames(x) = list(c("seed","plant"), c("seed","plant")); x})

返回相同的错误:Error in dimnames(x) <- list(c("seed", "plant"), c("seed", "plant")) : 'dimnames' applied to non-array

我在这里 R: change column names of every matrix in a list 也试过 loop,但没用。

for(i in seq_along(dlist4)) {
        dimnames(dlist4[[i]]) <- list(c("seed","plant"), c("seed","plant"))
 }

Error in dimnames(dlist4[[i]]) <- list(c("seed", "plant"), c("seed", "plant")) : 'dimnames' applied to non-array

由于您没有矩阵列表,而是矩阵列表列表,因此您将不得不使用嵌套 lapply() 或嵌套循环:

dlist4 <- tibble::lst(A, G, M_1, M_2)

lapply(dlist4, function(x) {lapply(x, `dimnames<-`, rep(list(c("seed", "plant")),2))})
#> $A
#> $A$a
#>       seed plant
#> seed     1     3
#> plant    2     4
#> 
#> $A$b
#>       seed plant
#> seed     2     4
#> plant    3     5
#> 
#> 
#> $G
#> $G$a
#>       seed plant
#> seed    10    12
#> plant   11    13
#> 
#> $G$b
#>       seed plant
#> seed     5     7
#> plant    6     8
#> 
#> 
#> $M_1
#> $M_1$a
#>       seed plant
#> seed    10    12
#> plant   11    13
#> 
#> $M_1$b
#>       seed plant
#> seed     5     7
#> plant    6     8
#> 
#> 
#> $M_2
#> $M_2$a
#>       seed plant
#> seed     2     4
#> plant    3     5
#> 
#> $M_2$b
#>       seed plant
#> seed     5     7
#> plant    6     8

或者,您也可以使用专为嵌套列表设计的 purrr::map_depth()

purrr::map_depth(dlist4, 
                 2, 
                 `dimnames<-`, 
                 rep(list(c("seed", "plant")),2)
                 )

reprex package (v2.0.1)

于 2022-03-25 创建

您的主列表中没有矩阵,您有另一组列表 - 参见 lapply(dlist4, class)。所以它不是 4 个矩阵,它是 4 组两个矩阵,每个都在一个列表中。

在这种情况下,您需要递归地向下搜索直到停止命中列表,这意味着 rapply 可能很方便:

rapply(dlist4, function(x) {dimnames(x) <- rep(list(c("seed","plant")), 2); x}, how="list")
#$A
#$A$a
#      seed plant
#seed     1     3
#plant    2     4
#
#$A$b
#      seed plant
#seed     2     4
#plant    3     5
#
#
#$G
#$G$a
#      seed plant
#seed    10    12
#plant   11    13
#...