从R中的多个API导入和提取数据

时间:2018-08-09 19:17:45

标签: r api url

我将2个API(应用程序编程接口)导入R:

library(jsonlite)
library(dplyr)

a0 <- fromJSON("https://hello.com/users/0/bets") 
a1 <- fromJSON("https://hello.com/users/1/bets") 

我从每个API获取数据框:

a0 <- df0
a1 <- df1 

使用bind_rows库中的dplyr,将两个数据帧合并为一个(我也可以使用rbind.data.frame):

a <- bind_rows(a1, a2) 

我总共有500个API,范围从https://hello.com/users/0/betshttps://hello.com/users/499/bets,所以我想为所有这些API做上面的工作。

我似乎无法找到解决方案,所以有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

类似的东西:

  • 创建一个空列表以存储您计划抓取的每个data.frame
  • 遍历URL以获取数据框,并将每个数据框存储为列表元素
  • 然后do.call(rbind)将所有数据帧放在一起。

result_list <- vector(mode="list", length=500)
for(bet in 0:499) {
    this_url <- paste0("https://hello.com/users/", bet, "/bets")
    result_list[[bet]] <- fromJSON(this_url)
}
result <- do.call(rbind, result_list)

答案 1 :(得分:0)

如果要使用import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.function.Function; class Person { String name ; PersonalDetail pDetail; public Person(String name, PersonalDetail pDetail) { super(); this.name = name; this.pDetail = pDetail; } public String getName() { return name; } public void setName(String name) { this.name = name; } public PersonalDetail getpDetail() { return pDetail; } public void setpDetail(PersonalDetail pDetail) { this.pDetail = pDetail; } } class PersonalDetail{ BirthDate birthDate; public BirthDate getBirthDate() { return birthDate; } public void setBirthDate(BirthDate birthDate) { this.birthDate = birthDate; } public PersonalDetail(BirthDate birthDate) { super(); this.birthDate = birthDate; } } class BirthDate { public String getBirthdate() { return birthdate; } public void setBirthdate(String birthdate) { this.birthdate = birthdate; } String birthdate; public BirthDate(String birthdate) { super(); this.birthdate = birthdate; } } public class Test1 { public static void main(String[] args) { BirthDate b1 = new BirthDate("2019-08-08"); BirthDate b2 = new BirthDate("2025-09-09"); BirthDate b3 = new BirthDate("2025-09-08"); BirthDate b4 = new BirthDate("2024-09-08"); PersonalDetail pd1 = new PersonalDetail(b1); PersonalDetail pd2 = new PersonalDetail(b2); PersonalDetail pd3 = new PersonalDetail(b3); PersonalDetail pd4 = new PersonalDetail(b4); Person p1 = new Person("P1",pd1); Person p2 = new Person("P2",pd2); Person p3 = new Person("P3",pd3); Person p4 = new Person("P4",pd4); List<Person> persons = new ArrayList(); persons.add(p1); persons.add(p2); persons.add(p3); persons.add(p4); Function<Person, PersonalDetail> getCourse = Person::getpDetail; Person minByAge = persons.stream() .max(Comparator.comparing(getCourse.andThen(PersonalDetail::getBirthDate).andThen(BirthDate::getBirthdate))).get(); System.out.println(maxByAge.getName()); } } / map中的purrr函数,可以一行完成。 tidyverse是一个函数,该函数基本上调用map_dfr以将某个函数应用于列表(在本例中为map),然后调用fromJSON以将reduce应用于列表中的所有元素,返回一个数据帧。

实际上,如果您的URL如此简单,只包含一个整数,则可以bind_rows取代map,创建一个具有该整数的URL,然后调用1:500 。我正在使用fromJSON来创建URL,但是如果实际的URL格式不同,则可以进行调整。

stringr::str_glue