Я думаю, что вы здесь немного запутались (это легко происходит при изучении R!). Это основано на том, что вы видите forest_list[i]<-matrix[i]
. Списки могут быть доступны с использованием либо одиночных скобок [i]
, двойных скобок [[i]]
, либо соглашения о названии доллара, которое вы использовали: forest$HEW39
. Одиночная скобка берет «ломтик», который возвращает данные, но это все еще список. Двойные скобки возвращают объект в позиции 'i'
списка, так же как dollar-name возвращает элемент списка с этим именем. NB вы также можете использовать [["HEW39"]]
.
Я думаю, именно отсюда и возникает путаница. Я не думаю, что у вас есть список списков, просто простой список, но попытка получить доступ к этому списку с помощью одинарной скобки возвращает список (длиной 1) вашей матрицы. Так выглядит список списков. И, естественно, вы пытаетесь создать матрицу из этого. Но матрица есть, вам просто нужно получить к ней доступ, используя двойные скобки.
Чтобы ответить на ваш вопрос, я составил список из 5 матриц, похожих на вашу, и назвал их:
forest <- lapply(c(1,2,3,4,5), function(f){replicate(2, rnorm(5))})
names(forest) <- paste0("HEW", 1:5)
Примечание:
class(forest[1])
[1] "list"
class(forest[[1]])
[1] "matrix"
class(forest$HEW1)
[1] "matrix"
Для индексации мы можем использовать цикл for и записать в новый список
forest_list <- as.list(names(forest))
for (i in 1:length(forest)) {
matrixi <- forest[[i]]
forest_list[[i]] <- matrixi
}
Если у вас есть список списков, например ::1010 *
forest_lol <- list(1)
forest_lol[[1]] <- forest_list
вы можете перебирать нужный вам первичный список (например, [[1]]
в данном случае):
forest_list <- as.list(names(forest))
for (i in 1:length(forest_lol[[1]])) {
matrixi <- forest_lol[[1]][[i]]
forest_list[[i]] <- matrixi
}
Сохранение имен в новых списках означает просто захват их в векторе во время цикла for или более простое именование на основе предыдущего списка:
name_vector <- c()
for (i in 1:length(forest)) {
name_vector <- c(name_vector, names(forest)[i])
}