我有500个文件(.nc文件),每个文件包含四年长的变量PotEvap或Pr的月度数据,每个变量(PotEvap/Pr)、GCM(干、中等)、方案(历史/rcp45等)的组合一个文件.我要做的是在.nc文件中 for each 月编写一个.tif文件.因此,每个.nc文件应该成为每月60个.tif文件.

它正在奏效,但只是部分奏效. 循环每月正确地在.nc文件中写入一个.tif文件,但它不能正确匹配特定的.nc文件和.tif文件.例如,下面的第一个结果是正确的,但第二个结果不匹配:

Processing: PotEvap middle rcp45 
Processing file: C:/Postdoc/ExposureProj/Climdata1/PotEvap_middle_rcp45_2056_2060.nc 
Writing to file: C:/Postdoc/ExposureProj/raw_tifs/PotEvap_middle_rcp45_2056_01.tif 
Writing to file: C:/Postdoc/ExposureProj/raw_tifs/PotEvap_middle_rcp45_2056_02.tif

(等,保持每年正确写入月度文件)

Processing: pr middle rcp45 
Processing file: C:/Postdoc/ExposureProj/Climdata1/PotEvap_middle_rcp45_2056_2060.nc 
Writing to file: C:/Postdoc/ExposureProj/raw_tifs/pr_middle_rcp45_2056_01.tif

(等)

我们可以从初始数据帧(下面)中看到,它使用变量/GCM/Scenario的唯一组合正确地将这些变量复制到输出目录,但不会将它们复制到用于输入的文件.因此,对于要处理的文件,‘PR Midrcp45’变成了‘PotEvap Midrcp45’.

初始数据帧(nc.vals1,在下面的循环中使用,与原始数据帧相比,这只是一个较小的可重现数据帧)

structure(list(variable = structure(c(1L, 2L, 1L, 2L), levels = c("PotEvap", 
"pr"), class = "factor"), gcm = structure(c(1L, 1L, 2L, 2L), levels = c("middle", 
"dry"), class = "factor"), scen = structure(c(1L, 1L, 1L, 1L), levels = "rcp45", class = "factor")), out.attrs = list(
    dim = c(121L, 12L, 2L, 2L, 1L), dimnames = list(Var1 = c("Var1=1950", 
    "Var1=1951", "Var1=1952", "Var1=1953", "Var1=1954", "Var1=1955", 
    "Var1=1956", "Var1=1957", "Var1=1958", "Var1=1959", "Var1=1960", 
    "Var1=1961", "Var1=1962", "Var1=1963", "Var1=1964", "Var1=1965", 
    "Var1=1966", "Var1=1967", "Var1=1968", "Var1=1969", "Var1=1970", 
    "Var1=1971", "Var1=1972", "Var1=1973", "Var1=1974", "Var1=1975", 
    "Var1=1976", "Var1=1977", "Var1=1978", "Var1=1979", "Var1=1980", 
    "Var1=1981", "Var1=1982", "Var1=1983", "Var1=1984", "Var1=1985", 
    "Var1=1986", "Var1=1987", "Var1=1988", "Var1=1989", "Var1=1990", 
    "Var1=1991", "Var1=1992", "Var1=1993", "Var1=1994", "Var1=1995", 
    "Var1=1996", "Var1=1997", "Var1=1998", "Var1=1999", "Var1=2000", 
    "Var1=2001", "Var1=2002", "Var1=2003", "Var1=2004", "Var1=2005", 
    "Var1=2006", "Var1=2007", "Var1=2008", "Var1=2009", "Var1=2010", 
    "Var1=2011", "Var1=2012", "Var1=2013", "Var1=2014", "Var1=2015", 
    "Var1=2016", "Var1=2017", "Var1=2018", "Var1=2019", "Var1=2020", 
    "Var1=2021", "Var1=2022", "Var1=2023", "Var1=2024", "Var1=2025", 
    "Var1=2026", "Var1=2027", "Var1=2028", "Var1=2029", "Var1=2030", 
    "Var1=2031", "Var1=2032", "Var1=2033", "Var1=2034", "Var1=2035", 
    "Var1=2036", "Var1=2037", "Var1=2038", "Var1=2039", "Var1=2040", 
    "Var1=2041", "Var1=2042", "Var1=2043", "Var1=2044", "Var1=2045", 
    "Var1=2046", "Var1=2047", "Var1=2048", "Var1=2049", "Var1=2050", 
    "Var1=2051", "Var1=2052", "Var1=2053", "Var1=2054", "Var1=2055", 
    "Var1=2056", "Var1=2057", "Var1=2058", "Var1=2059", "Var1=2060", 
    "Var1=2061", "Var1=2062", "Var1=2063", "Var1=2064", "Var1=2065", 
    "Var1=2066", "Var1=2067", "Var1=2068", "Var1=2069", "Var1=2070"
    ), Var2 = c("Var2= 1", "Var2= 2", "Var2= 3", "Var2= 4", "Var2= 5", 
    "Var2= 6", "Var2= 7", "Var2= 8", "Var2= 9", "Var2=10", "Var2=11", 
    "Var2=12"), Var3 = c("Var3=PotEvap", "Var3=pr"), Var4 = c("Var4=middle", 
    "Var4=dry"), Var5 = "Var5=rcp45")), row.names = c(1L, 1453L, 
2905L, 4357L), class = "data.frame")

我在出错的地方使用的循环:

foreach(k = iter(nc.vals1, by = "row")) %dopar% {
  require(raster)
  require(stringr)
  require(ncdf4)
  maca.dir <- "C:/Postdoc/ExposureProj/Climdata1"
  out.dir = "C:/Postdoc/ExposureProj/raw_tifs/"
  
  var.cur <- paste0(k$variable)
  gcm.cur <- paste0(k$gcm)
  scen.cur <- paste0(k$scen)
  
  cat("Processing:", var.cur, gcm.cur, scen.cur, "\n")
  
  dir.name <- paste0(var.cur, gcm.cur, scen.cur)
  dir.cur <- list.files(path = maca.dir, pattern = dir.name, full.names = FALSE)
  dat.dir <- paste0(maca.dir, "/", dir.cur)
  nc.files <- list.files(path = dat.dir, full.names = TRUE)
  
  for (f in nc.files) {
    cat("Processing file:", f, "\n")
    dat.stack <- stack(f)
    dat.stack <- raster::shift(dat.stack, dx = -360)
    crs(dat.stack) <- "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
    
    num.layers <- seq(1:dim(dat.stack)[3])
    
    for (n in num.layers) {
      dat.raster <- dat.stack[[n]]
      yr.mo <- paste0(substr(names(dat.raster), 2, 5), "_", substr(names(dat.raster), 7, 8))
      
      # Correct the order of variables in the file name
      fname <- paste0(out.dir, var.cur, "_", gcm.cur, "_", scen.cur, "_", yr.mo, ".tif")
      
      cat("Writing to file:", fname, "\n")
      writeRaster(dat.raster, fname, drivername = "GTiff", overwrite = FALSE)
    }
  }
}

推荐答案

代码中定义的目录有问题;

dir.name <- paste0(var.cur, gcm.cur, scen.cur)
dat.dir <- paste0(maca.dir, "/", dir.cur) 
nc.files <- list.files(path = dat.dir, full.names = TRUE) 

需要更正为;

dir.name <- paste0(var.cur,"_", gcm.cur, "_", scen.cur
nc.files <- list.files(path = maca.dir, pattern=dir.name, full.names = TRUE)

R相关问答推荐

将带有范围的字符串转换为R中的数字载体

创建重复删除的唯一数据集组合列表

基于现有类创建类的打印方法(即,打印tibles更长时间)

无法将传奇添加到cowplot多情节中

如何根据组大小应用条件过滤?

R Sapply函数产生的值似乎与for循环方法略有不同

如何在格子中添加双曲曲线

如何在modelsummary中重命名统计数据?

如何调整曲线图中的y轴标签?

根据文本字符串中的值粘贴新列

R中的时间序列(Ts)函数计数不正确

在点图上绘制置信度或预测区间ggplot2

删除数据帧中特定行号之间的每第三行和第四行

在R中的数据框上使用Apply()函数时,如何保留非数字列?

按组跨多列创建伪变量

避免在图例中显示VLINS组

如何获取R chromote中的当前URL?

在不重复主题的情况下重新排列组

如何在访问之前下载的输入时同时上传和处理所有指定的shiny 输入?

将字符变量出现次数不相等的字符框整形为pivot_wider,而不删除重复名称或嵌套字符变量