#r #json #tidyverse #jsonlite
#r #json #tidyverse #jsonlite
Вопрос:
Я пытаюсь прочитать некоторые данные из британской информационной панели covid о данных вакцинации, которые кодируют некоторые данные в формате JSON в файле csv. (Ссылка для скачивания здесь) из данных о вакцинации, по дате вакцинации, возрасту, демографическим данным на странице (https://coronavirus.data.gov.uk/details/vaccinations?areaType=nationamp;areaName=England ). Проблема заключается в том, что мой код больше не успешно расширяет данные JSON в data.frame. Похоже, это проблема с синтаксическим анализом, когда данные попадают в объект None.
Мой код считывает данные следующим образом (этот код был успешным для данных, загруженных в 2021-11-25, но не удался с данными 2021-12-02). Приведенный ниже код завершается ошибкой при выполнении команды FromJSON, которая теперь выдает ошибку при достижении «аргумента»: None, указывающего на лексическую ошибку. Сообщение об ошибке показано под кодом.
library(tidyverse)
library(jsonlite)
#! Read in the latest national dashboard data
df <- read_csv("<filepath>")
df |>
mutate(vaccinationsAgeDemographics = map(vaccinationsAgeDemographics, ~fromJSON(. |> str_replace_all("'", """)))) |>
unnest(cols = c(vaccinationsAgeDemographics))
Error: Problem with `mutate()` column `vaccinationsAgeDemographics`.
i `vaccinationsAgeDemographics = map(...)`.
x lexical error: invalid char in json text.
yVaccinationDatePercentage": None}, {"age": "16_17", "Vaccin
(right here) ------^
Упрощенная тестовая строка будет выглядеть следующим образом:
fromJSON(df$vaccinationsAgeDemographics[1] |> str_replace_all("'", """))
что вызывает аналогичную ошибку:
Error: lexical error: invalid char in json text.
yVaccinationDatePercentage": None}, {"age": "16_17", "Vaccin
(right here) ------^
Комментарии:
1. В качестве быстрого исправления я только что заменил эти значения в строке на то, что может обрабатывать jsonlite, но сейчас это кажется неоптимальным
Ответ №1:
Мне удалось решить эту проблему, поскольку возможные сопоставления json обсуждаются в документах jsonlite здесь: https://cran.r-project.org/web/packages/jsonlite/vignettes/json-mapping.pdf
Зная заранее, что данные предназначены для числового типа и что None не содержится ни в одном из имен индикаторов, мы можем заменить None
строку на an "NA"
, используя следующий код:
library(tidyverse)
library(jsonlite)
df <- read_csv("C:\Users\joel.kandiah\Downloads\data_2021-Dec-02.csv")
fromJSON(df$vaccinationsAgeDemographics[1] |> str_replace_all("'", """) |> str_replace_all("None", ""NA""))