2015-08-01 3 views
1

Смотрите ниже R код, я использую пакет JSONlite, чтобы очистить данные с сайта: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, по крайней мере, я получаю желаемый выпуск. Однако, как я увеличиваю 'я' до 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

Проверить количество строк в 'а [1],' а [20], 'а [21]' и 'as.data.frame (а $ seasonhistory)'. Они должны быть одинаковыми для создания фрейма данных. Похоже, вам, возможно, потребуется добавить строку кода, чтобы вставить 'NA' там, где это необходимо. –

+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 s на своих местах.

Однако есть еще одна проблема с вашим кодом, о котором вы еще не знаете. Не каждая страница до 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)) 
+0

Спасибо большое! –

Смежные вопросы