使用循环提取坐标,匹配它们并写入文件

Using loops to extract coordinates, match them and write to file

我正在尝试使用 for 循环(或 apply 函数作为替代)从 data.frame 中提取坐标,搜索 E-OBS 中的最近点gridded dataset,提取时间 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 中所有坐标循环的一部分,并将温度数据写入新数据 -table 包含站点 ID 信息或替代进入 df.

的下一列

你或许可以做到:

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

只需将整个过程包装在定义的方法中,然后使用 apply 函数传入 lon/lat 坐标。一个很好的候选者是 mapply 或其包装器 Map,用于在 df$Edf$N 的两个向量之间按元素迭代。此外,第三个参数 df$site 被传递到唯一 CSV 名称的方法中,因为现在相同的文件将被覆盖。

下面一些非赋值行,例如 headsummary 被删除,因为它们在方法中什么都不做。此外,上下文管理器 withinwith 用于避免重复 Data$ 以实现更简化的数据操作。 Map 调用写入文件并构建聚合数据帧列表供以后使用。

函数

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