【问题标题】:R JSONlite: How to tackle below error?R JSONlite:如何解决以下错误?
【发布时间】:2015-08-01 16:19:48
【问题描述】:

请看下面的 R 代码,我正在使用 JSONlite 包从网站上抓取数据:

library(jsonlite)
    url <- "http://fantasy.premierleague.com/web/api/elements/"
    seasonsdata <- data.frame(matrix(NA,nrow=1,ncol=20))
    seasonsdata <- seasonsdata[-1,]
    fetchData <- function(i) {res <- try(a <- fromJSON(paste0(url,i)))
    if(!inherits(res,"try-error")) {b<-data.frame(a[1],a[20],a[21],as.data.frame(a$season_history))}}

    seasonsdata <- lapply(1:696, fetchData)
    seasonsdata <-do.call(rbind,lapply(seasonsdata,data.frame,stringsAsFactors=FALSE))

代码至少在 10 点之前可以正常工作,我得到了所需的输出。但是,当我将 'i' 增加到 696 时,我得到了错误:

Error in data.frame(a[1], a[20], a[21], as.data.frame(a$season_history)) : 
  arguments imply differing number of rows: 1, 0

有什么建议吗?

【问题讨论】:

  • 检查a[1]a[20]a[21]as.data.frame(a$seasonhistory)中的行数。它们需要相同才能创建数据框。看起来您可能需要添加一行代码以在必要时插入 NAs。
  • 你能帮我纠正一下代码吗?

标签: r web-scraping jsonlite


【解决方案1】:

如果 a$season_history 为空(第 57 页是一个示例),那么当您执行 data.frame(a[1], a[20], a[21], as.data.frame(a$season_history)) 时,前 3 个元素有一行(它们是标量),最后一个元素有零行。在您的函数中,您可以首先检查a$season_history 是否存在。如果不是,您可以在其位置创建一行 NAs。

但是,您可能还没有意识到您的代码存在另一个问题。并非每个到 696 的页面都存在,当您尝试从中提取数据时会出现 404 错误。在您执行最后的do.call(rbind, ...) 步骤之前,我添加了一些删除这些页面的步骤。

library(jsonlite)
url <- "http://fantasy.premierleague.com/web/api/elements/"
seasonsdata <- data.frame(matrix(NA, nrow = 1, ncol = 20))
seasonsdata <- seasonsdata[-1, ]
fetchData <- function(i) {
  res <- try(a <- fromJSON(paste0(url, i)))
  if (!inherits(res, "try-error")) {
    if (nrow(as.data.frame(a$season_history)) == 0) {
      b <- data.frame(a[1], a[20], a[21], as.data.frame(matrix(NA, ncol = 17)))
    } else {
      b <- data.frame(a[1], a[20], a[21], as.data.frame(a$season_history))
    }
  }
}

seasonsdata <- lapply(1:696, fetchData)
seasonsdata <- seasonsdata[!sapply(seasonsdata, is.null)]
seasonsdata <- seasonsdata[sapply(seasonsdata, is.data.frame)]
seasonsdata <- do.call(rbind,lapply(seasonsdata, data.frame, stringsAsFactors = FALSE))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2021-03-14
    • 2021-09-09
    相关资源
    最近更新 更多