JSON в CSV с использованием R - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь преобразовать файл ответов JSON с помощью пакета JSONlite, но у меня возникают некоторые проблемы с представлением данных во фрейме данных.

Используя этот код:


library(dplyr)
library(jsonlite)


json_data <- fromJSON("File Path")
df <-data.frame(unlist(json_data))

JSON Response выглядит так:

{
    "totalPages": 1,
    "firstPage": true,
    "lastPage": true,
    "numberOfElements": 1757,
    "number": 0,
    "totalElements": 1757,
    "columns": {
        "dimension": {
            "id": "variables/evar4",
            "type": "string"
        },
        "columnIds": [
            "1",
            "2",
            "3",
            "4"
        ]
    },
    "rows": [
        {
            "itemId": "0",
            "value": "Unspecified",
            "data": [
                220,
                1.0002442201269182,
                0.29499089253187616,
                2.890909090909091
            ]
        },
        {
            "itemId": "118293442",
            "value": "PNIwTjWWjphkqfu",
            "data": [
                5,
                1.0002442201269182,
                57.879999999999995,
                30.8
            ]
        },
        {
            "itemId": "1810135314",
            "value": "PNIFBOIKLplumdb",
            "data": [
                3,
                1.0002442201269182,
                1243.0277777777778,
                545.3333333333334
            ]
        }
    ]
}

Я получаю таблицу df, в которой все столбцы и строки находятся в одном списке. Есть ли способ, чтобы идентификаторы столбцов проходили через верх, при этом соответствующие идентификаторы строк соответствовали соответствующему столбцу?

Так что фрейм данных выглядит следующим образом:


                    1     2    3     4  
Unspecified        220  1.00 0.294   2.89
PNIwTjWWjphkqfu     5   1.00 57.87   30.8
PNIFBOIKLplumdb     3   1.00 1243.0  545.33

Любая помощь по этому вопросу будет принята с благодарностью

1 Ответ

1 голос
/ 17 апреля 2019

Обратите внимание, что ваш файл JSON в опубликованном виде является неполным и в нем отсутствуют закрывающие скобки.

Один из вариантов воспроизведения ожидаемого результата - unnest данные в элементе rows вывода fromJSON.

library(jsonlite)
json_data <- fromJSON("sample.json")

library(tidyverse)
json_data$rows %>%
    select(-itemId) %>%
    unnest() %>%
    group_by(value) %>%
    mutate(n = 1:n()) %>%
    spread(n, data) %>%
    ungroup()

## A tibble: 3 x 5
#  value             `1`   `2`      `3`    `4`
#  <chr>           <dbl> <dbl>    <dbl>  <dbl>
#1 PNIFBOIKLplumdb     3  1.00 1243.    545.
#2 PNIwTjWWjphkqfu     5  1.00   57.9    30.8
#3 Unspecified       220  1.00    0.295   2.89

Объяснение: я рекомендую построчно просматривать код, чтобы понять, что делает каждая команда. Короче говоря: json_data$rows - это data.frame; мы выбираем все столбцы, кроме itemId и unnest данные в list столбец data. Это приводит к тому, что ваши данные отображаются в длинном формате, поэтому для того, чтобы воспроизвести ожидаемые вами данные, нам необходимо изменить данные с длинных на широкие. Для этого мы группируем записи по value, добавляем счетчик и используем spread, чтобы получить окончательный результат.


Содержимое файла "sample.json"

{
    "totalPages": 1,
    "firstPage": true,
    "lastPage": true,
    "numberOfElements": 1757,
    "number": 0,
    "totalElements": 1757,
    "columns": {
        "dimension": {
            "id": "variables/evar4",
            "type": "string"
        },
        "columnIds": [
            "1",
            "2",
            "3",
            "4"
        ]
    },
    "rows": [
        {
            "itemId": "0",
            "value": "Unspecified",
            "data": [
                220,
                1.0002442201269182,
                0.29499089253187616,
                2.890909090909091
            ]
        },
        {
            "itemId": "118293442",
            "value": "PNIwTjWWjphkqfu",
            "data": [
                5,
                1.0002442201269182,
                57.879999999999995,
                30.8
            ]
        },
        {
            "itemId": "1810135314",
            "value": "PNIFBOIKLplumdb",
            "data": [
                3,
                1.0002442201269182,
                1243.0277777777778,
                545.3333333333334
            ]
        }
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...