Как создать функцию для получения исторической погоды в нескольких городах, используя R и DARKSKY api? - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь получить исторические данные о погоде для 100 городов в R, используя DARKSKY API.

Следующий код работает для получения исторических данных для 1 города, однако у меня возникают проблемы при создании al oop функция go через список 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)

Но он продолжает возвращать сообщения об ошибках.

Может кто-нибудь помочь, пожалуйста?

Спасибо

1 Ответ

0 голосов
/ 20 марта 2020

Вы почти у цели. Есть пара вещей, необходимых для итерации функции get_forecast_for по строкам. Из пакета purrr функция pmap хороша для повторения функции по строке, тогда как функция imap может использоваться для повторения функции по ячейкам подряд.

Используя этот подход, я написал две функции: weather_at_coords и weather. weather_at_coords используется для отправки запроса в DarkSkyAPI о погоде в указанном c местоположении в заданном диапазоне времени (т. Е. За последние десять дней). Функция 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. При необходимости измените имена переменных lat и lon.
...