Просто оберните весь процесс в определенный метод и используйте функцию apply для передачи в координатах lon / lat.Один великий кандидат - mapply
или его оболочка Map
для поэлементной итерации между обоими векторами df$E
и df$N
.Кроме того, третий аргумент, df$site
, передается в метод для уникальных имен CSV, так как сейчас тот же файл будет перезаписан.
Ниже некоторых строк без присваивания, таких как head
или summary
удалены, так как они ничего не делают внутри метода.Также контекстные менеджеры within
и with
используются, чтобы избежать повторения Data$
для более упорядоченной обработки данных.Вызов Map
записывает в файл AND, формируя список агрегированных фреймов данных для последующего использования.
Функция
my_function <- function(lon, lat, site) {
# Mean daily temperature
ncin <- nc_open("tg_0.25deg_reg_v17.0.nc")
print(ncin)
t <- ncvar_get(ncin,"time")
tunits <- ncatt_get(ncin,"time","units")nt <- dim(t)
# look for closest lon and lat
obsoutput <- ncvar_get(ncin,
start = c(which.min(abs(ncin$dim$longitude$vals - lon)),
which.min(abs(ncin$dim$latitude$vals - lat)),
1),
count = c(1,1,-1))
DataMeanT <- data.frame(DateN = t, MeanDailyT = obsoutput)
nc_close(ncin)
Data <- within(DataMeanT, {
Date <- as.Date(DateN, origin="2000-01-01")
Year <- format(Date,"%Y")
Month <- format(Date,"%m")
YearMonth <- format(Date, format="%Y-%b")
})
Data_annual <- with(Data, aggregate(list("AirT" = MeanDailyT), list(Year=Year),
FUN = mean, na.action = na.pass))
# Export table
write.table(Data_annual, paste0("Site_AirTemp_", site, "_.csv"), row.names=FALSE,
append = FALSE, col.names = TRUE, sep = ", ", quote = TRUE)
# SAVE AGGREGATED DATA FRAME
return(Data_annual)
}
Вызов
# ITERATE THROUGH EACH LON/LAT PAIR ELEMENTWISE
df_list <- Map(my_function, df$E, df$N, df$site)
# df_list <- mapply(my_function, df$E, df$N, df$site, SIMPLIFY=FALSE) # EQUIVALENT CALL