我有一个纬度,经度,开始年和结束年的数据框。我想要那个时期每个位置的平均降水量。
现在,我可以一次在一个位置获得此信息,但我想针对多个位置自动执行以下操作:
以下是一些先决条件:
#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,]
。
答案 0 :(得分:1)
一种方法是在apply
的行上lat_lon_df
自定义函数。
这里是一个例子:
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
请注意,当yrmin
和yrmax
不更改时,只需在meteo_nearby_stations
上使用lat_lon_df
就可以获取所需的信息。
您也可以将其定义为命名函数
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)