【问题标题】:How can I loop over multiple files when the function argument is different each time?当函数参数每次都不同时,如何循环多个文件?
【发布时间】:2017-11-10 19:13:48
【问题描述】:

我正在尝试从一系列 .nc 文件中提取海面温度数据。 所以我有一个文件夹,其中包含 30 个下载的 .nc 文件,所有文件都写成“1981.nc”、“1982.nc”等。

但不是单独加载它们,我想循环遍历每个文件并计算每个文件的平均温度,所以最后我会有 30 个温度值。

问题是每个文件的日期参数必须更改年份。我想在提取年份值的文件中包含years<-substr(filenames, 1,4) 之类的内容,但它不起作用。

我正在考虑以下几点:

library(ncdf4)

setwd("C:\\Users\\Desktop\\sst")
source("C:\\Users\\Desktop\\NOAA_OISST_ncdf4.R")

out.file<-""
filenames <- dir(pattern =".nc")
years<-substr(filenames, 1,4)
lst <- vector("list", length(filenames ))
for (i in 1:length(filenames)) {
  ssts = extractOISSTdaily(filenames[i], "C:\\Users\\Desktop\\lsmask.oisst.v2.nc",
                           lonW=350,lonE=351,latS=52,latN=56,date1='years[i]-11-23', date2='years[i]-12-31')
  mean(ssts)
}

这里描述了用于提取的extractOISSTdaily函数:http://lukemiller.org/index.php/2014/11/extracting-noaa-sea-surface-temperatures-with-ncdf4/

.nc 文件在这里:https://www.esrl.noaa.gov/psd/data/gridded/data.noaa.oisst.v2.highres.html#detail

【问题讨论】:

    标签: r loops apply


    【解决方案1】:

    这行得通吗?

    # Get filenames
    filenames <- dir(pattern =".nc")
    
    # Mean SSTs
    m.ssts <- NULL
    
    # Loop through filenames
    for (i in filenames) {
      # Get year (assuming form of filename is, e.g., 1981.nc)
      year <- sub(".nc", "", i)
    
      # Do whatever this function does
      ssts <- extractOISSTdaily(i, "C:\\Users\\Desktop\\lsmask.oisst.v2.nc",
                               lonW=350, lonE=351, latS=52, latN=56,
                               date1=paste(year, "-11-23", sep = ""), 
                               date2=paste(year, "-12-31", sep = ""))
      # Profit!
      m.ssts <- c(m.ssts, mean(ssts))
    }
    

    代码的工作原理是首先收集当前目录中扩展名为.nc 的所有文件名,然后创建一个空对象来存储平均 SST。 for 循环依次遍历文件名,通过用空字符串代替 .nc 来去除文件扩展名以获得年份(即,1981.nc 变为 1981)。接下来,将指定区间的 netCDF 数据放入ssts。间隔是通过将当前年份与所需的月份和日期粘贴在一起来创建的。最后,计算平均值并将其附加到m.ssts 对象。正如 OP 在下面所说,这实际上应该读取 m.ssts &lt;- c(m.ssts, mean(ssts, na.rm = TRUE)) 以允许数据中包含 NA

    【讨论】:

    • 您好,感谢您的回答,但它还没有工作。当我应用你的循环时,我会得到一个 60 个 NA 的列表。
    • 从头开始,我只需要删除计算平均值的 NA。非常感谢!
    • @ManassaMauler 很高兴它成功了!我只是添加了一些文字来稍微解释一下代码。
    猜你喜欢
    • 1970-01-01
    • 2018-09-08
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多