将“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
#...
我使用了这个帖子中的解决方案
我有一个包含 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
#...