簡體   English   中英

遍歷列表中的列表

[英]Iterate over list in list

我目前正在嘗試從列表列表中創建矩陣列表。 列表列表的成分是多邊形,即五個o中每個頂點的頂點坐標:

$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]
}

您看,這里的問題,或其中至少一個是“ forest $ i [1:5]”

如何像單個多邊形代碼中那樣選擇一個多邊形並在每行1 -5內? 另外,我需要維護每個多邊形的名稱嗎?

我認為您在這里有些困惑(學習R!時很容易發生)。 這是基於看到您使用forest_list[i]<-matrix[i] 可以使用單括號[i] ,雙括號[[i]]或您所使用的美元名稱約定來訪問列表forest$HEW39 單括號包含一個“切片”,該切片返回數據,但它仍然是一個列表。 雙括號將對象返回到列表中位置'i' ,與dollar-name返回具有該名稱的列表項相同。 注意,您也可以使用[["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])
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM