#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 😉