JSON в CSV с использованием R

#r #json #csv #dataframe

#r #json #csv #фрейм данных

Вопрос:

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

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

 
library(dplyr)
library(jsonlite)


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

 

Ответ 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
            ]
        }
    ]
}
 

Я получаю таблицу 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. Пожалуйста, проверьте свой пост; ваш файл JSON неполон и, как таковой, не имеет допустимого формата JSON.

Ответ №1:

Пожалуйста, обратите внимание, что ваш 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 это a data.frame ; мы выбираем все столбцы, кроме itemId , и unnest данные в list столбце data . Это приводит к тому, что ваши данные будут в формате long, поэтому, чтобы воспроизвести ваши ожидаемые данные, нам нужно изменить формат данных с long на wide. Для этого мы группируем записи по 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
            ]
        }
    ]
}
 

Комментарии:

1. Спасибо за этот ответ, он отлично сработал. Не могли бы вы рассказать мне, как работает этот код?

2. Сделано @AlokMadan 😉