【问题标题】:A continuation of... Extracting data from an API using R继续... 使用 R 从 API 中提取数据
【发布时间】:2019-02-07 14:09:30
【问题描述】:

我是这方面的超级新手,正在为我的论文研究 R。这个答案中的代码终于对我有用(Extracting data from an API using R),但我不知道如何向它添加循环。当我需要所有 3360 时,我不断获取 API 的第一页。 代码如下:

    library(httr)
    library(jsonlite)
    r1 <- GET("http://data.riksdagen.se/dokumentlista/? 
    sok=&doktyp=mot&rm=&from=2000-01-01&tom=2017-12- 31&ts=&bet=&tempbet=&nr=&org=&iid=&webbtv=&talare=&exakt=&planering=&sort=rel&sortorder=desc&rapport=&utformat=json&a=s#soktraff")

r2 <- rawToChar(r1$content)

class(r2)
r3 <- fromJSON(r2)

r4 <- r3$dokumentlista$dokument

当我到达 r4 时,它已经是一个数据框了。

请,谢谢!

编辑:最初,我无法获得包含该页面作为其中信息的 url。现在我有了它(下)。我仍然无法循环它。 "http://data.riksdagen.se/dokumentlista/?sok=&doktyp=mot&rm=&from=2000-01-01&tom=2017-12-31&ts=&bet=&tempbet=&nr=&org=&iid=&webbtv=&talare=&exakt=&planering=&sort=rel&sortorder=desc&rapport=&utformat=json&a=s&p="

【问题讨论】:

  • 你知道你的代码需要改变什么,比如说,获取第二页吗? URL 的某些部分是否需要修改?
  • 我查看了网址,但页码不存在。它在代码中,并且仅以我在 r3 中调用它的方式出现,即在解析它之后。顺便说一句,由于这是瑞典数据,因此“page”一词是“sida”,“pages”一词是“sidor”。我尝试在它之前和之后添加循环,但它不起作用。
  • 谢谢,这有帮助。标题和文字看起来好像您知道如何获取下一页,只是不知道如何循环编码。这个评论更清楚了。也许编辑您的问题以包含该信息以及您从迄今为止的一个答案中学到的知识。
  • 是的,对不起。不过,通过 DS_UNI 的回答,我已经弄清楚了。
  • 对,所以请将该信息编辑到您的问题中。如果有人来尝试回答,请在问题中向他们展示该信息,这样他们就不必运行您的代码,然后阅读这些 cmets 和现有答案并自己将它们放在一起。

标签: r json loops opendata


【解决方案1】:

我想你可以从r3中提取下一页的url如下:

next_url <- r3$dokumentlista$`@nasta_sida`
# you need to re-check this, but sometimes I'm getting white spaces within the url, 
# you may not face this problem, but in any case this line of code solved the issue 
next_url <- gsub(' ', '', n_url)

GET(next_url)

更新

我尝试了带有 10 页页码的 url,它有效

my_dfs <- lapply(1:10, function(i){
  my_url <- paste0("http://data.riksdagen.se/dokumentlista/?sok=&doktyp=mot&rm=&from=2000-01-01&tom=2017-12-31&ts=&bet=&tempbet=&nr=&org=&iid=&webbtv=&talare=&exakt=&planering=&sort=rel&sortorder=desc&rapport=&utformat=json&a=s&p=", i)
  r1 <- GET(my_url)
  r2 <- rawToChar(r1$content)
  r3 <- fromJSON(r2)
  r4 <- r3$dokumentlista$dokument
  return(r4)
})

更新 2:

提取的数据框很复杂(例如,某些列是数据框列表),这就是为什么简单的rbind 在这里不起作用的原因,您必须在将数据堆叠在一起之前进行一些预处理,像这样的东西会起作用

my_dfs %>% lapply(function(df_0){
      # Do some stuff here with the data, and choose the variables you need
      # I chose the first 10 columns to check that I got 200 different observations
      df_0[1:10]
    }) %>% do.call(rbind, .)

【讨论】:

  • 谢谢!它不太好用,但我得到了带有页码的 url ([1] "data.riksdagen.se/dokumentlista/…)。也许我现在可以循环播放它。[更新]:不,我仍然做不到。
  • 为什么?你有错误吗?请查看我的更新答案
  • 不,这并不是真正的错误。它只是提出了 20 个观察结果,不管我尝试什么。包括您更新的答案。 (而且我知道在整个时间范围内,应该有超过 67,000 个观测值)。
  • 啊哈好吧!我没有检查提取的数据
  • 我刚刚检查过,每页得到:57 个变量和 20 个观察值,你觉得对吗? (抱歉第一条评论错了,我更正了)
猜你喜欢
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 2018-02-16
  • 2015-02-07
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
相关资源
最近更新 更多