Извлекать аккуратные данные из комплекса, вложенного JSON в R - PullRequest
0 голосов
/ 02 апреля 2020

Извлечение аккуратных данных из простого JSON тривиально с пакетом tidyjson (https://cran.r-project.org/web/packages/tidyjson/vignettes/introduction-to-tidyjson.html)

Мне не удалось применить этот лог c в сложную вложенную JSON структуру. Подобный вопрос, такой как этот ( как вы извлекаете данные из вложенных json данных в R ), слишком конкретен c, поэтому я не могу экстраполировать его на другие случаи.

Эта структура может дать более общий случай (см. Рабочие воспроизводимые примеры здесь: 1.4 Примеры запросов: https://www.ree.es/en/apidatos)

{
        "data": {
          "type": "WIDGET TYPE",
          "id": "WIDGET_ID",
          "attributes": {
            "title": "WIDGET NAME",
            "last-update": "2019-02-01T08:26:34.000+01:00",
            "description": "WIDGET DESCRIPTION",
          },
          "meta": {
            "cache-control": {
              "cache": "HIT",
              "expireAt": "2019-03-01T17:18:22"
            }
          }
        },
        "included": [
          {
            "type": "INDICATOR_1 TYPE",
            "id": "INDICADOR_1_ID",
            "groupId": null,
            "attributes": {
              "title": "INDICADOR_1 NAME",
              "description": "INDICADOR_1 DESCRIPTION",
              "color": "#2fa688",
              "type": "INDICADOR_1 TYPE",
              "magnitude": "INDICADOR_1 MAGNITUDE",
              "composite": false,
              "last-update": "2019-02-19T08:26:34.000+01:00",
              "values": [
                {
                  "value": 12345,
                  "percentage": "VALUE BETWEEN 0 AND 1",
                  "datetime": "2019-02-04T20:44:00.000+01:00"
                }
              ]
            },
           {
            "type": "INDICATOR_2 TYPE",
            "id": "INDICADOR_1_ID",
            "groupId": null,
            "attributes": {
               …
            }
          }
        ]
       }
      }
  1. Первый уровень имеет объект "data" и массив "included"

  2. В массиве "included" имеется один объект для каждого индикатора

  3. В каждом из этих объекты есть объект "attributes" с массивом "values", в котором находятся окончательные данные: "value", "percentage" и "datetime"

Цель состоит в том, чтобы извлечь данные в аккуратный фрейм данных со столбцами "type", "title", "value", "percentage" и "datetime"

1 Ответ

0 голосов
/ 22 апреля 2020

Я узнал после многих проб и ошибок. Я отвечаю себе, если это может помочь кому-то еще, отходящему от объекта json:

library(tidyjson)

json %>% # our json object
  enter_object(included) %>% # to enter the object where the data are
  gather_array() %>% spread_all() %>% # to work with the array
  select(attributes.title) %>% # to maintain this variable
  enter_object(values) %>% # to enter the array where the final data are
  gather_array() %>% spread_all() %>% # same as before to work with the array
  select(indicator = attributes.title, value, percentage, datetime) # select final data

По сути, это тот же самый процесс enter_object %>% gather_array %>% spread_all %>% select, повторенный дважды. Вам нужно только назвать объекты, которые вы хотите ввести на каждом уровне, и фрагменты информации, которые вы хотите выбрать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...