Итерирование API GET по датам и расчесывание наборов данных в R - PullRequest
1 голос
/ 30 января 2020

Я пытаюсь создать функцию, которая может выполнять итерации в течение определенного промежутка времени (например, последние 30 дней или последние 90 дней). Я ограничен 2500 записями на одно нажатие, поэтому мне может потребоваться выполнять извлечение в течение 1 дня или 1 недели в зависимости от моих параметров.

Я смотрел на API Запросите здесь l oop и не можете заставить его делать то, что я хочу. Я создал функцию while(), которая создает вектор URL:

end_date   <- Sys.Date()
start_date <- as.Date("2020-01-27", format = "%Y-%m-%d")

the_date <- start_date

while(the_date <= end_date)
{
  api <-  paste0("https://website.com/api/?action=search_pcrs&e1=eTimes.03&o1=between&v1=",
               the_date,
               "^", 
               end_date,
               "&e2=eMedications.03&o2=in&v2type=id&v2=14731^14730^14729^3864&col...")
  the_date <- the_date + 1
  as.character(api)
  print(api)
  }

[1] "https://website.com/api/?action=search_pcrs&e1=eTimes.03&o1=between&v1=2020-01-27^2020-01-30&e2=eMedications.03&o2=in&v2type=id&v2=14731^14730^14729^3864&col..."
[1] "https://website.com/api/?action=search_pcrs&e1=eTimes.03&o1=between&v1=2020-01-28^2020-01-30&e2=eMedications.03&o2=in&v2type=id&v2=14731^14730^14729^3864&col...
[1] "https://website.com/api/?action=search_pcrs&e1=eTimes.03&o1=between&v1=2020-01-29^2020-01-30&e2=eMedications.03&o2=in&v2type=id&v2=14731^14730^14729^3864&col..."
[1] "https://website.com/api/?action=search_pcrs&e1=eTimes.03&o1=between&v1=2020-01-30^2020-01-30&e2=eMedications.03&o2=in&v2type=id&v2=14731^14730^14729^3864&col..."

Вот где я застрял. Я хотел бы создать функцию, которая перебирает каждый URL, а затем объединяет данные.

Когда я выполняю одну операцию, я использую следующее:

api_get  <- GET(url)
api_raw  <- rawToChar(api_get$content)
api_tree <- xmlTreeParse(api_raw, useInternalNodes = T)
api_df   <- xmlToDataFrame(api_tree, nodes = getNodeSet(api_tree, "//pcr")

Создание 30 из них, безусловно, не самый эффективный способ ... в надежде получить некоторую помощь в этом.

1 Ответ

1 голос
/ 30 января 2020

Этот скрипт должен работать, предполагая, что ваши утверждения и разбор API / Web-страницы верны.
Подробности см. В комментариях:

end_date   <- Sys.Date()
start_date <- as.Date("2020-01-27", format = "%Y-%m-%d") 
the_date <- start_date

#create an empty list
output<-list()

while(the_date <= end_date)
{
  #Track which date is being pulled - handy for debugging when script errors
  print(the_date)
  url <-  paste0("https://website.com/api/?action=search_pcrs&e1=eTimes.03&o1=between&v1=",
                 the_date,
                 "^", 
                 end_date,
                 "&e2=eMedications.03&o2=in&v2type=id&v2=14731^14730^14729^3864&col...")

  api_get  <- GET(url)
  api_raw  <- rawToChar(api_get$content)
  api_tree <- xmlTreeParse(api_raw, useInternalNodes = T)

  #Append dataframe to list - item named by date
  output[[as.character(the_date)]]<-xmlToDataFrame(api_tree, nodes = getNodeSet(api_tree, "//pcr"))
  #slight system pause to prevent attacking the server
  Sys.sleep(0.7)

  the_date <- the_date + 1
}

#combine all of the dataframes in the output list into one large data frame
alloutput<-do.call(rbind, output)
...