Использование циклов для извлечения координат, сопоставления их и записи в файл - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь использовать петли for (или функцию apply в качестве альтернативы) для извлечения координат из data.frame, поиска ближайшей точки в наборе данных с сеткой E-OBS Извлеките данные о температуре за время x1-x2 и запишите их в другой файл Excel.

Хотя код работает для извлечения отдельных точек данных, мне кажется, что я не могу включить этот код в цикл и добавить результаты потенциально рядом с входными координатами.

library(sp)
library(raster)
library(ncdf4)

#Coordinates
    df
       ID    site                 E        N
1       1   site_place_date1  7.558758 47.81004
2       2   site_place_date2  7.582749 47.63411
3       3   site_place_date3  7.607968 48.01475
4       4   site_place_date4  7.644660 47.67139
       ...     ...   ...              ...`

Установить координатыцелевой точки ВРУЧНУЮ:

lon <- 7.558758  # longitude of location                
lat <- 47.81004 # latitude  of location

#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)
      nt
      obsoutput <- ncvar_get(ncin, 
                       start= c(which.min(abs(ncin$dim$longitude$vals -   lon)), # look for closest long
                                which.min(abs(ncin$dim$latitude$vals -  lat)),  # look for closest lat
                                1),
                       count=c(1,1,-1))
      DataMeanT <- data.frame(DateN= t, MeanDailyT = obsoutput)
      nc_close(ncin)
      head(DataMeanT)


#check if there are NAs =999
    summary(DataMeanT)

    Data = DataMeanT
    Data$Date = as.Date(Data$DateN,origin="20000-01-01")
    Data$Year = format(Data$Date,"%Y")
    Data$Month = format(Data$Date,"%m")
    head(Data)
    Data$YearMonth = format(Data$Date, format="%Y-%b")

    Data_annual = aggregate(("T_AnnualMean" = MeanDailyT) ~ Year,data = Data, FUN = mean,na.action = na.pass)
    names(Data_annual)[2] <- "AirT"
    head(Data_annual)

#Export table
    write.table(Data_annual, "Site_AirTemp.csv", row.names = FALSE, append = FALSE, col.names = TRUE, sep = ", ", quote = TRUE)

Цель состоит в том, чтобы запустить скрипт как часть цикла для всех координат в df и записать данные о температуре в новую таблицу данных с информацией об идентификаторе участка илив качестве альтернативы в следующие столбцы DF.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Просто оберните весь процесс в определенный метод и используйте функцию 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
0 голосов
/ 17 февраля 2019

Трудно ответить на ваш вопрос, так как он не воспроизводим.Но вы, вероятно, можете сделать:

library(raster)
b <- brick("tg_0.25deg_reg_v17.0.nc")
e <- extract(b, df[, c('E', 'N')])
...