Извлечение значений из сложного объекта JSON

#r #json

#r #json

Вопрос:

У меня есть файл json, как показано ниже. Я хотел бы извлечь данные в R dataframe следующим образом. Посмотрите на объект json, который содержит список значений для разных дат. Я хотел бы извлечь эти значения в фрейм данных. Не могли бы вы любезно помочь, как я должен это построить?

Выходной фрейм данных

 Jan-18 a 5
Jan-18 b 0
Jan-18 c 9
Jan-18 d 0
Jan-18 e 5
Jan-19 a 4
Jan-19 b 0
Jan-19 c 26
Jan-19 d 0
Jan-19 e 35
 

value_headers = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]

Ввод содержимого JSON:

 {
    "default": {
        "timelineData": [
            {
                "time": "1610928000",
                "formattedTime": "Jan 18, 2021",
                "formattedAxisTime": "Jan 18",
                "value": [
                    5,
                    0,
                    9,
                    0,
                    5
                ],
                "hasData": [
                    true,
                    false,
                    true,
                    false,
                    true
                ],
                "formattedValue": [
                    "5",
                    "0",
                    "9",
                    "0",
                    "5"
                ]
            },
            {
                "time": "1611014400",
                "formattedTime": "Jan 19, 2021",
                "formattedAxisTime": "Jan 19",
                "value": [
                    4,
                    0,
                    26,
                    0,
                    35
                ],
                "hasData": [
                    true,
                    false,
                    true,
                    false,
                    true
                ],
                "formattedValue": [
                    "4",
                    "0",
                    "26",
                    "0",
                    "35"
                ]
            }
        ],
        "averages": [
            5,
            1,
            34,
            25,
            25
        ]
    }
}
 

Ответ №1:

Использование tidyverse может быть чем-то вроде:

 library(jsonlite)
library(tidyverse)

json_dt <- fromJSON('{
    "default": {
        "timelineData": [
            {
                "time": "1610928000",
                "formattedTime": "Jan 18, 2021",
                "formattedAxisTime": "Jan 18",
                "value": [
                    5,
                    0,
                    9,
                    0,
                    5
                ],
                "hasData": [
                    true,
                    false,
                    true,
                    false,
                    true
                ],
                "formattedValue": [
                    "5",
                    "0",
                    "9",
                    "0",
                    "5"
                ]
            },
            {
                "time": "1611014400",
                "formattedTime": "Jan 19, 2021",
                "formattedAxisTime": "Jan 19",
                "value": [
                    4,
                    0,
                    26,
                    0,
                    35
                ],
                "hasData": [
                    true,
                    false,
                    true,
                    false,
                    true
                ],
                "formattedValue": [
                    "4",
                    "0",
                    "26",
                    "0",
                    "35"
                ]
            }
        ],
        "averages": [
            5,
            1,
            34,
            25,
            25
        ]
    }
}')

tibble(
  time = json_dt$default$timelineData$formattedTime,
  value = json_dt$default$timelineData$formattedValue
) %>%
  unnest(value) %>%
  group_by(time) %>%
  mutate(
    letter = letters[1:n()],
    value = as.integer(value),
    time = str_replace(time, ",.*", ""),
    time = str_replace(time, " ", "-")
  )