请参阅下面的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))
该代码适用于&#39;我&#39;至少到10岁,我得到了理想的输出。但是,当我增加“我”时,到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
有任何建议吗?
答案 0 :(得分:0)
如果a$season_history
为空(第57页为示例),那么当您执行data.frame(a[1], a[20], a[21], as.data.frame(a$season_history))
时,前3个元素有一行(它们是标量),最后一个元素为零行。在您的功能中,您可以先检查a$season_history
是否存在。如果不是,您可以在其位置创建一行NA
。
但是您的代码还有另一个问题,您可能还不知道。并非每个页面都存在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))