如何使用 R 和 DARKSKY api 创建一个函数来检索多个城市的历史天气?

How to create a function to retrieve multiple cities historical weather using R and DARKSKY api?

我正在尝试使用 DARKSKY API 在 R 中检索 100 个城市的历史天气数据。

以下代码可用于获取 1 个城市的历史数据,但是我在创建循环函数以遍历 100 个纬度和经度的列表并吐出数据时遇到问题。

weather <- function(Long,Lat) 
{ a <-seq(Sys.Date()-10, Sys.Date(), "1 day") %>%
  map(~get_forecast_for(Long,Lat,.x, units = 'si')) %>%
  map_df('daily')

write.csv(a,"blah blah")

}

weather(52.6983,-1.0735)

我最初的想法是上传包含我需要的所有经度和纬度的 csv 文件。将它们设置为变量,然后将它们映射到上面的函数。

data <- read.csv("blah blah")
Long <- data$Longitude
Lat <- data$Latitude
map(c("Long","Lat"),weather)

但它不断返回错误信息。

有人可以帮忙吗?

谢谢

你快到了。按行迭代 get_forecast_for 函数需要做一些事情。在 purrr 包中,pmap 函数适用于按行重复函数,而 imap 函数可用于按行中的单元格重复函数。

使用这种方法,我写了两个函数:weather_at_coordsweatherweather_at_coords 用于向 DarkSkyAPI 发送请求以获取给定时间范围内(即最近十天)特定位置的天气。 weather函数用于按行重复函数。

我看到您想要嵌套对象 daily,因此编写了从响应中提取该列表的函数。我假设您也想要 data.frame 中的结果,所以我添加了 bind_rows。我添加了一个列 id 以便可以将行正确链接到某个位置(或者您可以添加您喜欢的任何列)。

# pkgs
library(tidyverse)
library(darksky)

# set API Key: free from https://darksky.net/dev
darksky::darksky_api_key()

# Forecast at a given point and time period
weather_at_coords <- function(...) {
  d <- rlang::list2(...)
  time <- seq(Sys.Date()-10, Sys.Date(), "1 day")
  response <- imap(time, ~ darksky::get_forecast_for(d$lat, d$lon, .x, units = "si")[["daily"]])
  out <- bind_rows(response) %>% mutate(id = d$id)
  return(out)
}

# primary function (iterates across rows)
weather <- function(data) {
  result <- pmap(data, ~ weather_at_coords(...))
  return(bind_rows(result))
}

# sample data
d <- data.frame(
  id = c("a", "b"),
  lat = c(37.8267,34.8267),
  lon = c(-122.423, -120.423)
)

# run
x <- weather(d)
x

备注

  1. 确保安装了 rlang 软件包
  2. 根据需要调整 latlon 变量名称。