Группировка / укладка растров из списка путей и извлечение их минимальных значений для каждой группы - PullRequest
2 голосов
/ 19 марта 2019

У меня есть список путей растров (rplist = 912 растровых путей для 912 растров (19yeras) (12 месяцев) (4 недели)), как показано ниже:

  [1] "C:/Users/Eric/Downloads/Results/RMI_2000_02_18.tif"
  [2] "C:/Users/Eric/Downloads/Results/RMI_2000_02_26.tif"
  [3] "C:/Users/Eric/Downloads/Results/RMI_2000_03_05.tif"
  [4] "C:/Users/Eric/Downloads/Results/RMI_2000_03_13.tif"
  [5] "C:/Users/Eric/Downloads/Results/RMI_2000_03_21.tif"
  [...] "......"
  [912] "C:/Users/Eric/Downloads/Results/RMI_2019_03_21.tif"

Iнеобходимо читать растры, группировать их ежемесячно для каждого года (например, принадлежащие RMI_2000_02) и затем извлекать минимум каждой перекрывающей ячейки как отдельный растр (игнорируйте значения NA, если таковые имеются).

################### SETTING UP WORKING DIRECTORY ############################
setwd(dirname(rstudioapi::getActiveDocumentContext()$path))

# list rasters in workin directory
rplist <- list.files(getwd(),full.names = TRUE)

Отсюда я не знаю, что я могу сделать с rs (как указано выше), но должно быть:

1. read rasters using rplist
2. group them by month for each year
3. extract the min raster

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Чтобы получить хороший ответ, вы должны предоставить пример данных (не внешний файл, используйте данные, которые поставляются с R, или создайте некоторые с кодом).Что вы можете сделать, это создать RasterStack s и вектор v, который группирует слои, которые необходимо объединить, а затем выполнить

x <- stackApply(s, v, fun=min, na.rm=TRUE)

Теперь с примерами данных

library(raster)
# RasterStack with 12 layers
s <- stack(system.file("external/rlogo.grd", package="raster")) 
s <- stack(s, s*2, s*3, s*4)
# make one layer with only NAs
values(s[[2]]) <- NA

# 12 corresponding dates
d <- paste0("RMI_2000", rep(sprintf("_%02d", 1:3), each=4), "_0", 1:4)
d
# [1] "RMI_2000_01_01" "RMI_2000_01_02" "RMI_2000_01_03" "RMI_2000_01_04" "RMI_2000_02_01" "RMI_2000_02_02" "RMI_2000_02_03" "RMI_2000_02_04" "RMI_2000_03_01" "RMI_2000_03_02" "RMI_2000_03_03" "RMI_2000_03_04"


# transform date into an index (stripping of the label and the week number)
i <- substr(d, 4, 11)
i
#[1] "2000_01" "2000_01" "2000_01" "2000_01" "2000_02" "2000_02" "2000_02" "2000_02" "2000_03" "2000_03" "2000_03" "2000_03"


ss <- stackApply(s, i, min, na.rm=TRUE)
ss
#class       : RasterBrick 
#dimensions  : 77, 101, 7777, 3  (nrow, ncol, ncell, nlayers)
#resolution  : 1, 1  (x, y)
#extent      : 0, 101, 0, 77  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=merc +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
#data source : in memory
#names       : index_2000_01, index_2000_02, index_2000_03 
#min values  :             0,             0,             0 
#max values  :           255,           510,           765 
2 голосов
/ 20 марта 2019

Один из способов сделать это, как показано ниже:

# list rasters in workin directory
rplist <- list.files(getwd(),full.names = TRUE)
r_name <- list.files(getwd(),full.names = FALSE)

# 1. read rasters using rplist
mrlist <- lapply(rplist, raster)
names(mrlist) <- r_name

# 2. stack rasters of the same month
tstList <- list()
tstStack <- stack()
i <- 1
for (y in 2000:2019){
  for (m in 1:12){
    # paste0(y,"_",sprintf("%02d", m)) returnes YEAR_MONTH
    tstStack <- stack(mrlist[grep(paste0(y,"_",sprintf("%02d", m)), names(mrlist))] )
    tstList[[i]] <- tstStack
    i <- i+1  
  } 
}

#3. extract the min raster(s)
min.rlist <- list()
for (i in 1:length(tstList)) {
  min.rlist[[i]] <- min(tstList[[i]])
  print(i) # to track the process
}
...