根据 R 中的文件名读取栅格子集

Posted

技术标签:

【中文标题】根据 R 中的文件名读取栅格子集【英文标题】:Reading in a subset of rasters based on filenames in R 【发布时间】:2016-11-17 19:43:41 【问题描述】:

我正在使用 R 中的栅格。准确地说,是从栅格中提取数据到坐标。但是,我的问题实际上并不在于使用栅格,而在于阅读我想要在任何给定时间使用的特定栅格。

我有 35 年的栅格数据,每个栅格的命名方式都反映了其日期。例如:“raster.01.01.1990.tif”

所有栅格都在一个文件夹中。有时我需要从所有栅格中提取数据,在这种情况下,这很简单。设置 wd,创建栅格列表,然后将这些栅格读入 R。

setwd("C:/Users/User/Folder/Rasters")
f <- list.files(getwd()) 
ras <- lapply(f,raster)

没问题。然后我可以做我需要做的事情。但是,有时我只想在某些年份工作。在这种情况下,我一直根据文件名是否包含我不想要的年份从我的文件列表中排除某些栅格。

setwd("C:/Users/User/Folder/Rasters")
f <- list.files(getwd()) 
# Choose years to exclude, e.g 2010, 2015, and 2016
f <-f[lapply(f,function(x)length(grep("2010|2015|2016",x,value=FALSE)))==0]
ras <- lapply(f,raster)

这种方法有效;但是,我不禁觉得可能有一个更优雅的解决方案。特别是,如果我只想处理 3 年的数据,那么我必须手动排除 32 年的数据。当然,打字不会花费那么长的时间......但它效率低下。

有没有比我上面使用的方法更有效的方法来根据文件名排除或包含文件?

谢谢!

【问题讨论】:

【参考方案1】:

使用 list.files() 中的模式参数来过滤您想要和不想要的内容。它是一个正则表达式

# without any regex 
list.files(path = "D:/xxx/", pattern = ".csv")
[1] "my_2015.csv" "my_2016.csv" "my_2017.csv"

# excluding those files having 2016 or 2017 in their names
list.files(path = "D:/xxx/", pattern = "[^2016|2017].csv$")
[1] "my_2015.csv"

【讨论】:

感谢您的改进。虽然这在计算上更有效(我猜),但它仍然意味着我每次想要排除不同年份时手动更改代码。 (公平地说,这可能是我的设计缺陷和/或我没有很好地描述我的问题)。 @Savi 是否回答了您的问题?关注***.com/help/someone-answers【参考方案2】:

我会编写一个函数,将文件名转换为data.frame 的行,其中包含文件名、年、月、日,可能还有Date 值。在这种情况下,选择既简单又优雅。

【讨论】:

对不起,如果这是一个简单的问题,但是:将文件名转换为 df 的行仍然会将原始文件名映射到新行,对吗?因此,如果 raster.01.01.1990.tif 变为 row: 1 | 1990 |一月 | 01 后面的命令将“第 1 行”读取为栅格然后会抓取原始栅格 01.01.1990.tif?

以上是关于根据 R 中的文件名读取栅格子集的主要内容,如果未能解决你的问题,请参考以下文章

R矢量地图栅格化(将shapefile转换成raster)

根据文件名中的日期模式从目录中读取文件子集的更快和更节省内存的方法是啥?

如何在R中的并行任务中删除临时文件

R栅格:以像元值为条件的范围

r 由两个不同栅格确定的单元格中的栅格砖总和值,如何加快计算速度

R中的多栅格随机森林