是否有R函数可将栅格堆栈应用于 Dataframe 列表

ht4b089n  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(90)

我是一个全新的T R(工作室),并试图建立光栅堆栈。我的输入是大约600 jp 2文件,它们都在同一个目录下看起来像这样的图像文件在目录(https://i.stack.imgur.com/Mcvpn.png
文件被排序,以便波段数2,3,4和8都在一行4。根据我的光栅堆栈应该总是包含这4个波段。我想做一个循环/函数,以便R采取4个文件,然后做光栅堆栈,然后采取下一个4个文件,并再次做光栅堆栈,等等。
因此,我尝试将所有文件存储在一个 Dataframe 中并将其拆分,以便在每个 Dataframe 中我正好有我需要的4个波段。这样做奏效了,我创建了一个包含所有 Dataframe 的列表(每个 Dataframe 有4个波段)。之后,我想使用lapply分配raster::stack,但问题来了。我必须为每个daataframe分配$以执行raster:stack。只要我这样做,结果就很好,但我必须一直编写相同的“代码”,只是更改$后面的值。我认为使用lapply时,一个列表中的所有 Dataframe 都将被分配。我如何一次调用所有 Dataframe (我尝试使用[])并分配函数raster::stack?我将添加一些图像,希望人们理解我的问题Using lapply, calling each data frame with $, d calling all data frames at once
That should be the result for all the images
Thats the result if i try to call all dfs at once with [], it just adds the ind

jk9hmnmh

jk9hmnmh1#

当问一个R问题时,你应该总是包括一些示例数据和代码。并且总是以文本的形式包括输出,而不是以图像的形式(当然,除非输出是一个图表)。
示例文件名

ff <- paste0("202001", rep(c("01", "06", "11"), each=4), "_B0", c(2:4,8), ".png")
ff
#[1] "20200101_B02.png" "20200101_B03.png" "20200101_B04.png" "20200101_B08.png"
#[5] "20200106_B02.png" "20200106_B03.png" "20200106_B04.png" "20200106_B08.png"
#[9] "20200111_B02.png" "20200111_B03.png" "20200111_B04.png" "20200111_B08.png"

删除不需要的文件并按日期拆分

sf <- ff[-grep("B08", ff)]
date <- substr(basename(sf), 1, 8)
s <- split(sf, date)
str(s)
#List of 3
# $ 20200101: chr [1:3] "20200101_B02.png" "20200101_B03.png" "20200101_B04.png"
# $ 20200106: chr [1:3] "20200106_B02.png" "20200106_B03.png" "20200106_B04.png"
# $ 20200111: chr [1:3] "20200111_B02.png" "20200111_B03.png" "20200111_B04.png"

“terra”包已经取代了“raster”包,所以让我们使用它并列出SpatRasters。

library(terra)
x <- lapply(s, rast)

但是您可以使用光栅包和stack执行等效的操作。

library(raster)
x <- lapply(s, stack)

相关问题