Перебирать список в списке - PullRequest
0 голосов
/ 05 июля 2018

В настоящее время я пытаюсь создать список матриц из списка списков. Составной частью списка являются полигоны, то есть координаты вершин каждой из пяти вершин:

$HEW18
     [,1]    [,2]
[1,] 595165.9 5688133
[2,] 595065.9 5688133
[3,] 595065.9 5688233
[4,] 595165.9 5688233
[5,] 595165.9 5688133

$HEW19
     [,1]    [,2]
 [1,] 593512.7 5672780
 [2,] 593412.7 5672781
 [3,] 593414.0 5672881
 [4,] 593514.0 5672880
 [5,] 593512.7 5672780

Всего в этом файле 150 полигонов

Теперь, чтобы создать пространственную структуру данных, мне нужно создать матрицы из «внутренних» списков или из списка матриц ...

Мне удалось сделать это для одного отдельного многоугольника, например:

#turn list to matrix
matrixHEW39 = matrix(c(forest$HEW39[1:5,]), nc=2, byrow = FALSE)

То, что я хотел бы сделать сейчас, это сэкономить время и НЕ записывать это для всех 150 полисов отдельно, а создать цикл for для него.

Следующий код представляет мою не определенную «идею» о том, как это должно работать:

forest_list <-list()

for (i in forest) {
   matrix[i] = matrix(c(forest$i[1:5], nc =2, byrow = FALSE)
   forest_list[i]<-matrix[i]
}

Видите ли, проблема здесь, или, по крайней мере, одна из них - это "лес $ i [1: 5]"

Как выбрать ОДИН из полигонов и в каждой строке 1-5, как в коде одного полигона? Кроме того, мне нужно сохранить имена каждого многоугольника?

1 Ответ

0 голосов
/ 05 июля 2018

Я думаю, что вы здесь немного запутались (это легко происходит при изучении 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])
}
...