[英]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.