【问题标题】:Meteo_pull_monitors for mean climate data by lat/longMeteo_pull_monitors 按纬度/经度的平均气候数据
【发布时间】:2019-02-16 03:10:04
【问题描述】:

我有一个纬度、经度、开始年份和结束年份的数据框。我想要那个时期每个地点的平均降水量。

现在,我可以一次为一个位置获取此信息,但我想为多个位置自动执行以下操作:

这里有一些先决条件:

#library(xts)
#library(rnoaa)
#options(noaakey = "...") # https://ropensci.org/blog/2014/03/13/rnoaa/ says how to get a API key
#station_data <- ghcnd_stations() # Takes a while to run
statenv <- new.env()
lat_lon_df<-structure(list(lat = c(41.1620277777778, 44.483333, 44.066667
), long = c(-96.4115, -92.533333, -93.5), yrmin = c(2001L, 1983L, 
                                                    1982L), yrmax = c(2010L, 1990L, 1992L), id = c("ithaca", "haycreek", 
                                                                                                   "waseca")), class = "data.frame", row.names = c(1389L, 1395L, 
                                                                                                                                                   1403L))

这是肉。

ll_df<-lat_lon_df[1,]
nearby_station<-meteo_nearby_stations(lat_lon_df = ll_df,
    lat_colname = "lat", lon_colname = "long",
    station_data = station_data, radius = 50, year_min=ll_df[1,"yrmin"],
    year_max=ll_df[1,"yrmax"],limit=1, var="PRCP")


nearby_station<-meteo_nearby_stations(lat_lon_df = ll_df,lat_colname = "lat", lon_colname = "long",
                                          station_data = station_data, radius = 50, year_min=ll_df[1,"yrmin"],
                                          year_max=ll_df[1,"yrmin"],limit=1, var="PRCP")
e <- lapply(nearby_station,function(x)  meteo_pull_monitors(x$id[1])) #get actual data based on monitor id's

ll<-xts(e[[1]]$prcp,order.by=e[[1]]$date)
x<-paste0(ll_df[1,"yrmin"],"/",ll_df[1,"yrmax"]) 
 mean(xts::apply.yearly(na.omit(ll[x]),sum))/10 #divide by 10, put in mm

这将返回 776.23。最终结果应该是一个数据框,现在有一个新列“precip”,如下所示:

     lat      long yrmin yrmax       id    precip
41.16203 -96.41150  2001  2010   ithaca    776.23
44.48333 -92.53333  1983  1990 haycreek    829.65
44.06667 -93.50000  1982  1992   waseca    894.62

必须有一种方法来解决这个问题 只需逐行重复lat_long_df,即lat_lon_df[1,],然后是lat_lon_df[2,],最后是lat_lon_df[3,]

【问题讨论】:

    标签: r rnoaa


    【解决方案1】:

    一种方法是在lat_lon_df 的行上使用apply 自定义函数。

    这是一个例子:

    library(xts)
    library(rnoaa)
    

    设置 API 密钥

    #options(noaakey = "...") # https://ropensci.org/blog/2014/03/13/rnoaa/ says how to get a API key
    
    station_data <- ghcnd_stations() #meta-information about all available GHCND weather stations
    

    现在应用您在apply 调用中描述的所有步骤

    out <- apply(lat_lon_df, 1, function(x){
      min_year <- x[3] #extract the needed values min_year, max_year and ll_df
      max_year <- x[4] 
      ll_df <- data.frame(lat = as.numeric(x[1]),
                          long = as.numeric(x[2]),
                          id = x[5])
      nearby_station <- meteo_nearby_stations(lat_lon_df = ll_df,
                                              lat_colname = "lat",
                                              lon_colname = "long",
                                              station_data = station_data,
                                              radius = 50,
                                              year_min = min_year,
                                              year_max = max_year,
                                              limit=1,
                                              var="PRCP")
      res <- lapply(nearby_station, function(y) {
        res <- meteo_pull_monitors(y[1]$id)
        }
        )
      ll <- xts(res[[1]]$prcp, order.by=res[[1]]$date)
      x <- paste0(min_year <- x[3],"/",max_year) 
      mean(xts::apply.yearly(na.omit(ll[x]),sum))/10
    }
    )
    
    data.frame(lat_lon_df, precip = out)
    #output
              lat      long yrmin yrmax       id   precip
    1389 41.16203 -96.41150  2001  2010   ithaca 776.2300
    1395 44.48333 -92.53333  1983  1990 haycreek 829.6500
    1403 44.06667 -93.50000  1982  1992   waseca 894.6273
    

    请注意,当yrminyrmax 不更改时,只需在lat_lon_df 上使用meteo_nearby_stations 即可获得所需的信息。

    您也可以将其定义为命名函数

    get_mean_precip <- function(x){
      min_year <- x[3]
      max_year <- x[4]
      ll_df <- data.frame(lat = as.numeric(x[1]),
                          long = as.numeric(x[2]),
                          id = x[5])
      nearby_station <- rnoaa::meteo_nearby_stations(lat_lon_df = ll_df,
                                                     lat_colname = "lat",
                                                     lon_colname = "long",
                                                     station_data = station_data,
                                                     radius = 50,
                                                     year_min = min_year,
                                                     year_max = max_year,
                                                     limit=1,
                                                     var = "PRCP")
      res <- lapply(nearby_station, function(y) {
        res <- rnoaa::meteo_pull_monitors(y[1]$id)
      }
      )
      ll <- xts::xts(res[[1]]$prcp, order.by=res[[1]]$date)
      x <- paste0(min_year <- x[3],"/",max_year) 
      mean(xts::apply.yearly(na.omit(ll[x]),sum))/10
    }
    

    并将其用作:

    out <- apply(lat_lon_df, 1, get_mean_precip)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 2017-02-06
      • 2018-07-27
      • 1970-01-01
      相关资源
      最近更新 更多