每次函数参数不同时,如何循环遍历多个文件?

时间:2017-11-10 19:13:48

标签: r loops apply

我试图从一系列.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

1 个答案:

答案 0 :(得分: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循环通过文件名依次剥离文件扩展名以获取年份(即1981.nc变为1981),代替.nc替换空字符串。接下来,指定间隔的netCDF数据放在ssts中。通过将当前年份与所需的月份和日期粘贴在一起来创建间隔。最后,计算均值并将其附加到m.ssts对象。如下面的OP所述,实际上应该读取m.ssts <- c(m.ssts, mean(ssts, na.rm = TRUE))以允许数据中的NA

相关问题