R создать список матриц - PullRequest
       20

R создать список матриц

0 голосов
/ 04 августа 2020

Этот пост похож на мой пост ранее.

Допустим, если у меня есть коды ниже:

my_list <- list(c(1,2),3,4)

x = list()
for(i in 1:4) {
  x[[i]] <- matrix(1:9*i, nrow = 3)
}

Где my_list это:

[[1]]
[1] 1 2

[[2]]
[1] 3

[[3]]
[1] 4

Что мне написать, чтобы получить те же результаты, что и ниже?

[[1]]
[[1]][[1]]
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

[[1]][[2]]
     [,1] [,2] [,3]
[1,]    2    8   14
[2,]    4   10   16
[3,]    6   12   18


[[2]]
     [,1] [,2] [,3]
[1,]    3   12   21
[2,]    6   15   24
[3,]    9   18   27

[[3]]
     [,1] [,2] [,3]
[1,]    4   16   28
[2,]    8   20   32
[3,]   12   24   36

Я пробовал использовать приведенные ниже коды, но в данном случае это не работает:

mat <- ls(pattern = "x[[\\d+$]]", envir = .GlobalEnv)
mat_list <- lapply(my_list, function(i) mget(mat[i], envir = .GlobalEnv))

и

mat_list <- lapply(my_list, function(i) x[[i]])

1 Ответ

1 голос
/ 04 августа 2020

Вы можете использовать relist, чтобы сделать структуру x похожей на my_list:

relist(x, my_list)

#[[1]]
#[[1]][[1]]
#     [,1] [,2] [,3]
#[1,]    1    4    7
#[2,]    2    5    8
#[3,]    3    6    9

#[[1]][[2]]
#     [,1] [,2] [,3]
#[1,]    2    8   14
#[2,]    4   10   16
#[3,]    6   12   18


#[[2]]
#[[2]][[1]]
#     [,1] [,2] [,3]
#[1,]    3   12   21
#[2,]    6   15   24
#[3,]    9   18   27


#[[3]]
#[[3]][[1]]
#     [,1] [,2] [,3]
#[1,]    4   16   28
#[2,]    8   20   32
#[3,]   12   24   36

Аналогичный результат получается с использованием lapply:

lapply(my_list, function(i) x[i])

Если вы хотите избежать вложенного вывода для одиночной матрицы и хотите, чтобы он был именно таким, как показано, вы можете использовать:

lapply(my_list, function(i) if(length(i) > 1) x[i] else x[[i]])

#[[1]]
#[[1]][[1]]
#     [,1] [,2] [,3]
#[1,]    1    4    7
#[2,]    2    5    8
#[3,]    3    6    9

#[[1]][[2]]
#     [,1] [,2] [,3]
#[1,]    2    8   14
#[2,]    4   10   16
#[3,]    6   12   18


#[[2]]
#     [,1] [,2] [,3]
#[1,]    3   12   21
#[2,]    6   15   24
#[3,]    9   18   27

#[[3]]
#     [,1] [,2] [,3]
#[1,]    4   16   28
#[2,]    8   20   32
#[3,]   12   24   36

Вы можете прочитать разницу между [ и [[ здесь: Разница между скобкой [] и двойной скобкой [[]] для доступа к элементам списка или фрейма данных

...