在列表中迭代列表

问题描述 投票:1回答:1

我目前正在尝试从列表列表中创建矩阵列表。列表列表的成分是多边形,即五个顶点中的每一个的顶点坐标:

$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个多边形

现在为了创建一个spatialpolygonsdataframe,我必须从“inside”列表或矩阵列表中创建矩阵......

我设法为一个单一的多边形这样做:

#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中选择?另外,我需要保持每个多边形的名称?

r list loops for-loop nested
1个回答
0
投票

我觉得你在这里有点困惑(学习R时很容易发生!)。这是基于您使用forest_list[i]<-matrix[i]。可以使用单括号Lists,双括号[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
}

如果你有一个列表清单,例如:

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])
}
© www.soinside.com 2019 - 2024. All rights reserved.