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

时间:2016-11-17 19:43:41

标签: r

我正在使用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年的数据。当然, 很长时间没有输出...但它效率低下。

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

谢谢!

2 个答案:

答案 0 :(得分:0)

我会编写一个函数,将文件名转换为包含文件名,年,月,日和data.frame值的Date行。在这种情况下,选择很容易和优雅。

答案 1 :(得分:0)

使用list.files()中的pattern参数来过滤你想要的和不想要的东西。它是一个正则表达式

# 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"