Извлечение во фрейм данных из сгенерированного JSON многоуровневого списка с отсутствующими элементами - PullRequest
0 голосов
/ 02 января 2019

Я извлекаю футбольные данные через API - полученный JSON возвращается в виде списка; dput пример ниже:

list(list(id = 10332894L, league_id = 8L, season_id = 12962L, 
aggregate_id = NULL, venue_id = 201L, localteam_id = 51L, 
visitorteam_id = 27L, weather_report = list(code = "drizzle", 
    temperature = list(temp = 53.92, unit = "fahrenheit"), 
    clouds = "90%", humidity = "87%", wind = list(speed = "12.75 m/s", 
        degree = 200L)), attendance = 25098L, leg = "1/1", 
deleted = FALSE, referee = list(data = list(id = 15267L, 
    common_name = "L. Probert", fullname = "Lee Probert", 
    firstname = "Lee", lastname = "Probert"))), list(id = 10332895L, 
league_id = 8L, season_id = 12962L, aggregate_id = NULL, 
venue_id = 340L, localteam_id = 251L, visitorteam_id = 78L, 
weather_report = list(code = "drizzle", temperature = list(
    temp = 50.07, unit = "fahrenheit"), clouds = "90%", humidity = "93%", 
    wind = list(speed = "6.93 m/s", degree = 160L)), attendance = 22973L, 
leg = "1/1", deleted = FALSE, referee = list(data = list(
    id = 15273L, common_name = "M. Oliver", fullname = "Michael Oliver", 
    firstname = "Michael", lastname = "Oliver"))))

Я сейчас извлекаю, используя цикл for - представьте 2 элемента списка верхнего уровня, когда в полных данных их сотни. Основным недостатком использования цикла является то, что иногда отсутствуют значения, которые приводят к остановке цикла. Я хотел бы переместить это в purrr, но я пытаюсь извлечь вложенные элементы 2-го уровня, используя at_depth или modify_depth. Есть также гнезда внутри гнезд, которые действительно увеличивают сложность.

Конечное состояние должно быть аккуратным фреймом данных - из этих данных df будет иметь только 2 строки, но будет иметь много столбцов, каждый из которых представляет элемент, независимо от того, где этот элемент вложен в этот список. Если чего-то не хватает, тогда это должно быть значение NA.

Идеальный сценарий для решения, даже если он может быть не элегантным, состоит в том, что для каждого уровня / вложенного элемента создается кадр данных, который затем можно связать вместе.

спасибо.

1 Ответ

0 голосов
/ 02 января 2019

Шаг 1: замените NULL на NA, используя функцию вики сообщества здесь

simple_rapply <- function(x, fn)
{
  if(is.list(x))
  {
    lapply(x, simple_rapply, fn)
  } else
  {
    fn(x)
  }
}    
non.null.l <- simple_rapply(l, function(x) if(is.null(x)) NA else x)

Шаг 2:

library(purrr)
map_df(map(non.null.l,unlist),bind_rows)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...